前言
单身狗不就来刷刷题咯,今年比较简单
7-1 520表白
在 520 这个日子里,拼题 A 请你实现一个小功能,帮助用户向自己喜欢的数字表白。
输入格式: 输入在一行中给出一个不超过 1000 的正整数 N,是用户最喜欢的一个数字。
输出格式: 在一行中按以下格式输出对 N 的表白:
N! 520! 输入样例: 233 输出样例: 233! 520!
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
scanf("%d", &n);
printf("%d! 520!", n);
}
7-2 分糖豆
N 个宝宝分 M 颗 m&m 糖豆,如果每人分 K 个,够不够分呀?
输入格式: 输入在一行中给出 3 个正整数,分别是 N(不超过 100),是宝宝们的总人数;M(不超过 1000),是糖豆的总颗数;K(不超过 10),是要分给每个宝宝的糖豆数。
输出格式: 如果每人 K 个正好能够分完,输出 zheng hao mei ren K!;如果分完了还剩 X 颗糖豆,则输出 hai sheng X!;如果不够分的,还差 X 颗糖豆,则输出 hai cha X!。
输入样例 1: 10 50 5 输出样例 1: zheng hao mei ren 5! 输入样例 2: 12 30 2 输出样例 2: hai sheng 6! 输入样例 3: 15 40 3 输出样例 3: hai cha 5!
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, k;
scanf("%d%d%d", &n,&m,&k);
if(n * k == m)
printf("zheng hao mei ren %d!", k);
else if(n * k > m)
printf("hai cha %d!", n * k - m);
else
printf("hai sheng %d!", m - n * k);
}
7-3 约会App
在 520 这个日子里,没有比开发一个约会 App 更合适做的事情了。这个软件的需求很简单,用户输入自己的性别、想要约会的异性的年龄范围 [a,b]、身高范围 [c,d],你要帮用户筛选出系统中满足其约会条件的所有异性。注意:性别、年龄、身高的要求必须全都符合要求才可以。
输入格式: 输入第一行首先给出一个用户自己输入的信息,格式如下:
性别 a b c d 其中 性别 为 0 表示女性,1 表示男性,是该用户自己的性别;后面四个数字依次表示该用户想要约会的异性的年龄下限、年龄上限、身高下限、身高上限 —— 注意这里的范围都是闭区间。
随后一行给出一个正整数 N≤100,随后 N 行,每行给出一位系统中登记的约会对象的信息,格式如下:
性别 年龄 身高 这里保证年龄和身高(包括上、下限)均为不超过 200 的正整数,同行数字间以 1 个空格分隔。
输出格式: 按照输入的顺序,输出每个满足用户约会条件的约会对象的信息,输出格式与输入格式相同。题目保证至少有一个人可以被输出。
输入样例: 1 20 25 160 175 6 0 28 165 1 21 170 0 25 160 0 22 180 1 20 175 0 20 175 输出样例: 0 25 160 0 20 175
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, sex, a1, a2, b1, b2;
cin >> sex >> a1 >> a2 >> b1 >> b2;
cin >> n;
while(n--) {
int x, a, b;
cin >> x >> a >> b;
if(x != sex && a >= a1 && a <= a2 && b >= b1 && b <= b2)
printf("%d %d %d\n", x, a, b);
}
}
7-4 关于奇数的等式
给定任一正奇数 n>3 和一个解的上界 m>3,求三个正奇数 x、y、z,满足 0<x<y<z≤m 且有等式 3/n=1/x+1/y+1/z。
输入格式: 输入给出正奇数 3<n<400 和解的上界 m≤1000。
输出格式: 在一行中输出给定范围内最小的一组解 x y z(即存在多组解时取最小的 x,并列时取最小的 y)。数字间以 1 个空格分隔,行首尾不得有多余空格。
如果给定范围内无解,则输出 No solution in (3, m]. 其中 m 是给定的上界。
输入样例 1: 27 500 输出样例 1: 11 55 495 输入样例 2: 27 50 输出样例 2: No solution in (3, 50].
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
scanf("%d%d", &n, &m);
for(int i = 3; i < m; i += 2) {
for(int j = i + 2; j < m; j += 2) {
for(int k = j + 2; k <= m; k += 2) {
if(3*i*j*k == n*(i*j+j*k+i*k)) {
printf("%d %d %d\n", i, j, k);
return 0;
}
}
}
}
printf("No solution in (3, %d].", m);
}
7-5 我侬数
元初的中国书画大家赵孟頫的妻子管道升曾经写过一首脍炙人口的《我侬词》,词中道:“把一块泥,捻一个你,塑一个我。将咱们两个一齐打破,用水调和。再捏一个你,再塑一个我。我泥中有你,你泥中有我。” 给定一对正整数 A 和 B,将它们的各位数字收集到一起,再重新分成两个数 A′和 B′,我们称这样的 A′和 B′互为基于 A 和 B 的“我侬数“。本题就请你判断任一对数字是否是基于给定 A 和 B 的“我侬数“。
输入格式: 输入首先在第一行中给出两个不超过 104位的正整数 A 和 B,为“我侬数“的基础数。随后每行给出一对不超过 2×104位的正整数 A ′和 B ′。数字间以 1 个空格分隔。 输入以一对 0 结束,这一对 0 不要处理。题目保证至少有一对需要判定的数字。
输出格式: 对每一对 A ′和 B ′,判断其是否是基于给定 A 和 B 的“我侬数“。如果是,则在一行中输出 Yes,否则输出 No。
注意:所有数字均不考虑前导 0。例如 A=101,B=2021,则我们不能判定 012 和 0121 为“我侬数“。
输入样例: 521212577999 21100008482136 521212577999 21100008482136 00210908482136 512121257799 123456789012597890 11100222 786238645254 19024781758903 21100008482136 521212577999 90 52121257792110008482136 0 0 输出样例: Yes No Yes No Yes No
#include <bits/stdc++.h>
using namespace std;
void f(int a[], string s) {
for(int i = s.find_first_not_of("0"); i < s.length(); ++i)
a[s[i]-'0']++;
}
int main(){
int a[10] = {0};
string s1, s2;
cin >> s1 >> s2;
f(a, s1); f(a, s2);
while(cin >> s1 >> s2) {
if(s1 == "0" && s2 == "0")
break;
int b[10] = {0}, flag = 1;
f(b, s1); f(b, s2);
for(int i = 0; i < 10; ++i) {
if(a[i] != b[i])
flag = 0;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
7-6 非诚勿扰
“非诚勿扰”是江苏台一款非常受欢迎的相亲节目,台上的女嘉宾们可以从出场的男嘉宾中选择自己喜欢的牵手离开。问题是怎样才能选到最适合自己的男嘉宾呢?这是个概率问题。
解决这个问题有一种随机算法:假设女嘉宾知道自己最多能在台上录几期节目,也就知道自己最多能见到 N 位男嘉宾,那么她可以选择一个随机数 R(<N),对她见到的前 R 位男嘉宾,一个都不牵,只是以他们中最合适的那位作为一个标准,从第 R+1 位男嘉宾开始,只要遇到一个比标准更合适的,就决定牵手。理论上可以证明,当 R=N/e (其中 e 是自然常数,约等于 2.718)时,这样做能牵手最合适的男嘉宾的概率最高。
本题就请你根据男嘉宾的出场顺序,预测一下女嘉宾会牵手哪一位。
输入格式: 输入首先在第一行中给出正整数 N(3≤N≤104),即男嘉宾的数量。第二行给出 N 个互不相同的正整数,第 i 个数字表示第 i 位男嘉宾在女嘉宾心目中的得分。数字均不超过 105,之间以空格分隔。
输出格式: 女嘉宾将以 R=?N/e? 为线,采用题面中描述的算法选择牵手的男嘉宾。这里我们取 e=2.718。请在一行中输出她牵手的男嘉宾的序号和真正最适合她的男嘉宾的序号(从 1 开始),数字间以 1 个空格分隔。
如果她一直没有遇到比标准更合适的人,就会独自离开,此时对应的序号输出为 0。
输入样例 1: 10 23 84 15 29 17 56 85 40 91 28 输出样例 1: 7 9 输入样例 2: 10 56 85 17 23 84 15 29 40 31 28 输出样例 2: 0 2
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,x;
scanf("%d", &n);
int r = n/2.718, max1 = 0, max2 = 0, l1 = 0, l2 = 0, flag = 1;
for(int i = 1; i <= n; ++i) {
scanf("%d", &x);
if(i <= r) max1 = max(max1, x);
else if(x > max1 && flag){
l1 = i;
flag = 0;
}
if(x > max2) {
max2 = x;
l2 = i;
}
}
printf("%d %d\n", l1, l2);
}
7-7 新式六合彩
新式六合彩跟传统六合彩其实没有半点关系,只是姥姥为了出题杜撰出来的一种玩法——每位玩家可以下注一个六位数,如果跟开出来的幸运六位数最接近就可以获奖(所谓最接近,是指该数字与幸运数之差的绝对值最小)。
但规则如果这么简单就没什么可玩的了…… 我们把规则搞复杂一点:首先创建一个有 n×m 个格子的矩阵,保证格子总数不小于玩家总数,可以把所有玩家下注的数字随机放进格子里,每个格子最多放一个。然后我们随机生成一个幸运行号 r (1≤r≤n)和幸运列号 c (1≤c≤m),再随机生成一个幸运六位数。中奖者是第 r 行和第 c 列的所有六位数中与幸运数最接近的那个数字的主人。
本题就请你写个程序实现这个抽奖功能。
输入格式: 输入第一行给出 2 个正整数 n 和 m(1≤n,m≤1000),随后 n 行,每行给出 m 个数字,对应该位置格子里玩家下注的数字。如果这个格子是空的,就用 ?1 表示。最后一行给出幸运行号 r、幸运列号 c 和幸运六位数。同行数字间以空格分隔。
注意:行号从上向下递增,列号从左向右递增,均从 1 开始计数。
输出格式: 按照 (行号:列号) 的格式输出中奖者的位置。如果中奖者不唯一,则按照首先在幸运行中从左到右,然后在幸运列中从上到下的顺序输出,每行输出一位中奖者的位置。注意同一个位置只能输出一次。题目保证至少存在一位中奖者。
输入样例: 4 5 233333 000001 -1 888888 666666 001010 369624 777888 -1 999999 480735 100000 591846 369623 123123 456456 591846 000000 501000 233333 2 3 480735 输出样例: (2:2) (3:3)
#include <bits/stdc++.h>
using namespace std;
int a[1500][1500];
struct node{
int x, y;
};
vector<node> v;
int main() {
int n, m, r, c, k, dis = 1e9;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
scanf("%d", &a[i][j]);
scanf("%d%d%d", &r, &c,&k);
for(int i = 1; i <= m; ++i) {
if(a[r][i] == -1)
continue;
if(abs(a[r][i] - k) < dis) {
dis = abs(a[r][i] - k);
v.clear();
v.push_back({r, i});
}
else if(abs(a[r][i]-k) == dis) {
v.push_back({r, i});
}
}
for(int i = 1; i <= n; ++i) {
if(a[i][c] == -1 || i == r)
continue;
if(abs(a[i][c] - k) < dis) {
dis = abs(a[i][c] - k);
v.clear();
v.push_back({i, c});
}
else if(abs(a[i][c] - k) == dis) {
v.push_back({i, c});
}
}
for(int i = 0; i < v.size(); ++i)
printf("(%d:%d)\n", v[i].x, v[i].y);
}
7-8 521序列
所谓“521 序列”是指将一个原始整数序列 S 中的每个数字分别乘以 5、2、1 后形成的序列,例如 S= { 5, 2, 1 } 时,其对应的 521 序列就是 { 25, 10, 5, 10, 4, 2, 5, 2, 1 } —— 这里我们不要求这个序列一定具有某种顺序,即 521 序列中元素的顺序是可以打乱的。给定 S 后,计算其对应的 521 序列是很简单的。但给定一个 521 序列,恢复其对应的原始序列 S 就略微复杂一点了。本题就请你恢复任意给定的 521 序列的原始序列。
输入格式: 输入第一行给出正整数 N(<105),为 521 序列的长度。随后一行给出 N 个整数,即给定的 521 序列。所有数字的绝对值不超过 105,以空格分隔。
输出格式: 在一行中按照非递增序输出 521 序列对应的原始序列。数字间以 1 个空格分隔,行首尾不得有多余空格。
题目保证原始序列是存在的。
输入样例: 12 1 -5 10 -1 2 4 5 -2 5 25 10 2 输出样例: 5 2 1 -1
#include <bits/stdc++.h>
using namespace std;
multimap<int, int> m;
vector<int> v;
int main(){
int n,x;
scanf("%d",&n);
for(int i = 0; i < n; ++i){
scanf("%d",&x);
m.insert({x, 1});
}
while(m.size()) {
x = m.begin()->first;
if(x < 0) x /= 5;
m.erase(m.find(x));
m.erase(m.find(x*2));
m.erase(m.find(x*5));
v.push_back(x);
}
sort(v.begin(), v.end(), greater<int>());
for(int i = 0; i < v.size(); ++i)
cout << v[i] << " \n"[i == v.size() - 1];
}
|