A
济世之光
时间限制:1000ms 内存限制:65536kb
通过率:89/167 (53.29%)
正确率:89/419 (21.24%)
题目描述
ModricWang是一位光明圣堂武士,拥有等离子护盾和济世之光技能,可以保护自己的队友。由于技能有冷却时间,每次只能选择生命值最少的队友进行保护。
由于队友的数量有点多,ModricWang一下子看不过来,希望你能在1000ms内帮助ModricWang确定需要保护的队友的生命值是多少。
如果所有人生命值都相同,ModricWang会认为大家都处于危险之中,将牺牲自己的生命值发动技能“济世之光”,为所有人提供灵能护盾。
输入
第一个数为队友数n,2<=n<=1000
第二行n个整数,代表队友的生命值,都在int范围内。
输出
如果所有人生命值都相同,输出"En Taro Modric"
否则输出生命值最少的队友的生命值
输入样例1
5
99 100 61 61 82
输出样例1
61
输入样例2
5
76 76 76 76 76
输出样例2
En Taro Modric
考察知识点
条件判断语句的使用
解题思路
先读入第一个数,并假定它是最小的数。
然后依次读入剩下的n-1个数,与之前最小的数作比较,如果比最小的数小,那么将它记为最小的数。
在读入n-1个数时,只要有一个数与之前最小的数不相等,就说明这组数不完全相等。
参考代码
#include <iostream>
using namespace std;
int n, i, Min, num;
bool changed = false;
int main() {
cin >> n;
cin >> Min;
for (i = 0; i < n - 1; i++) {
cin >> num;
if (num != Min) changed = true;
if (num < Min) Min = num;
}
if (changed) cout << Min << "\n";
else cout << "En Taro Modric\n";
}
B
王助教玩逢七必过
时间限制:1000ms 内存限制:65536kb
通过率:32/123 (26.02%)
正确率:32/308 (10.39%)
题目描述
“逢七必过”是一个很简单的游戏。
n个人围坐一个环形(编号从1到n),从1号开始,从一个指定数字p每人逐次递增报数,每遇到数字中含有7或数字是7的倍数就拍手。当然如果做错的话就gg。
王助教打算在他手机安装一个程序,这样他就可以知道轮到自己时,下个需要拍手的数字是多少了。现在由你来实现吧。
输入
三个整数,人数n,王助教的编号i,开始的数字p。
1<n≤100001<n≤10000
1≤i≤n1≤i≤n
1≤p≤231−11≤p≤231−1
输出
下一个要拍手的数字。
输入样例1
5 3 70
输出样例1
72
输入样例2
10 1 8
输出样例2
28
考察知识点
条件判断,取模运算,模拟
解题思路
对于“数字中含7”和“是7的倍数”需要分开判断。
之前已经做过一个“提取十位数”的题,对于“数字中含7”的情况,需要挨个提取(从高到低或者从低到高都行)数字的每一位,并和7作比较。
对于“是7的倍数”则比较简单,直接对7取模即可。
可以让p每次加1来模拟游戏过程,游戏每进行一步都执行上面的验证过程。需要注意的是,虽然p在输入时在int范围内,但是递加后会超出int,需要使用范围更大的数据类型。
参考代码
#include <iostream>
using namespace std;
long long n, i, p;
bool check(long long x) {
while (x > 0) {
if (x % 10 == 7) return true;
x /= 10;
}
return false;
}
int main() {
cin >> n >> i >> p;
p += i - 1;
while (true) {
if (p % 7 == 0 || check(p)) {
cout << p << endl;
break;
}
p += n;
}
}
C
xjx的晚会舞伴
时间限制:1000ms 内存限制:65536kb
通过率:11/75 (14.67%)
正确率:11/229 (4.80%)
题目描述
xjx想在晚会上挑选舞伴,他打算挑一个颜值最高的妹子当舞伴,于是他翻出一个妹子名单,上面有一叠妹子照片。他把这些照片一字排开,但是他发现要具体给颜值界定一个具体的数太困难了,他只能判断相邻两个照片哪个妹子颜值更高。现在由你来帮他给出一个颜值可能最高的妹子的待选列表吧。
输入
第一行为一个整数n,代表妹子数量(妹子编号为1~n)。
第二行为n-1个整数xi,代表相邻的两个妹子谁颜值更高。
xi<0表示左面的更高,
xi>0表示右面的更高,
xi=0表示妹子颜值无法区分。
1≤n≤10001≤n≤1000
−100≤xi≤100−100≤xi≤100
输出
输出一行,颜值可能最高的妹子的待选列表(编号从小到大升序)
输入样例
6
1 1 -1 1 1
输出样例
3 6
考察知识点
条件判断,逻辑推理
解题思路
题意即:给出一组数据的相邻之间的定性的大小关系,找出所有比相邻值都大的元素的位置。
对于不在边缘的数,只要向左右两边找到第一个不为0的差值,符合“左正右负”即可。边缘的数只要比它唯一相邻的数大即可。
需要注意的是,如果所有人都无法区分,那么所有人都有可能是最高。
参考代码
#include<iostream>
using namespace std;
const int MaxN = 1000 + 7;
int n, Left, Right;
int a[MaxN];
int main() {
cin >> n;
for (int i = 1; i < n; i++) cin >> a[i];
a[0] = 1;
a[n] = -1;
for (int i = 1; i <= n; i++) {
Left = i - 1;
Right = i;
while (a[Left] == 0)Left--;
while (a[Right] == 0)Right++;
if (a[Left] > 0 && a[Right] < 0)cout << i << " ";
}
cout << "\n";
}
D
王助教活了多久
时间限制:1000ms 内存限制:65536kb
通过率:7/97 (7.22%)
正确率:7/403 (1.74%)
题目描述
王助教经常会不记得自己多大了,搞不清楚自己是多少岁。王助教把他的生日告诉你,请你计算一下他今天多大了。王助教有强迫症,所以他要知道很精确的年龄。
要精确到天。
规定今天是2016年10月19日。
王助教在计算年份时,以10月19日到上一年的10月19日为一整年。
例如2015年10月19日到2014年10月19日为一整年。
王助教在计算月份时,以19日到下月(或上月)的19日为一整月。
例如从5月19日到6月19日就算一整月。
王助教还是弹簧手,所以他有可能输入不合法或者不可能的日期,这时请输出Invaild date.。
你可以假设王助教能活任意久(但不能活到公元前)。
输入
多组数据读入。
组数至少1组,至多10组。
每组数据一行,包含3个整数y,m,d,依次为王助教生日的年、月、日。
−9999≤y
≤9999
−9999≤y≤9999
−9999≤
m≤9999−9999≤m≤9999
−9999≤
d≤9999−9999≤d≤9999
输入保证每组数据一定包含3个整数。
输出
对于每组数据,输出一行英文,表示王助教已经活了多少年多少月多少天。
例如Wang assistant is 20 years, 1 month, 0 day old.
若王助教输入了不正确的日期,输出Invailddate.。
请保证英文语法通顺。
请按照样例那样填写0补位,不要省略。
样例里的0已经酿成大错,现在只好将错就错了。。
请注意首字母大写。
输入样例
1996 6 12
2016 10 19
2016 10 20
-9999 9 9
输出样例
Wang assistant is 20 years, 4 months, 7 days old.
Wang assistant is 0 year, 0 month, 0 day old.
Invaild date.
Invaild date.
考察知识点
模拟,日期计算
解题思路
按照题意,需要先将day对齐到19,然后将month对齐到10,最后将year对齐到2016。对于闰年需要特殊处理。
合法性判断有两点,首先,日期本身要合法,像1月70日这种肯定是不合法的。其次,不能来自于未来。
输出上坑了大家,非常抱歉,0应该算作复数的,还有Invalid也拼错了,这里向大家道歉,以后会尽量避免这些问题。(虽然这题不是我出的)
参考代码
#include <iostream> using namespace std; int main() { int y, m, d; int monthday[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; while (cin >> y >> m >> d) { if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) monthday[1] = 29; if (y <= 0 || y > 2016 || y == 2016 && (m > 10 || m == 10 && d > 19)) cout << "Invaild date.\n"; else if (d <= 0 || d > monthday[m - 1] || m <= 0 || m > 12) cout << "Invaild date.\n"; else { if (m < 10) { y = 2016 - y; if (d <= 19) { d = 19 - d; m = 10 - m; } else { d = monthday[m - 1] - d + 19; m = 9 - m; } } else if (m > 10) { y = 2015 - y; if (d <= 19) { d = 19 - d; m = 22 - m; } else { d = monthday[m - 1] - d + 19; m = 21 - m; } } else { if (d <= 19) { y = 2016 - y; m = 0; d = 19 - d; } else { y = 2015 - y; d = 50 - d; m = 11; } } cout << "Wang assistant is "; if (y > 1)cout << y << " years, "; else cout << y << " year, "; if (m > 1)cout << m << " months, "; else cout << m << " month, "; if (d > 1)cout << d << " days old." << endl; else cout << d << " day old." << endl; } monthday[1] = 28; } return 0; }