16级C++第三次上机解题报告

A 济世之光

时间限制:1000ms  内存限制:65536kb

通过率:89/167 (53.29%)   正确率:89/419 (21.24%)

题目描述

ModricWang是一位光明圣堂武士,拥有等离子护盾和济世之光技能,可以保护自己的队友。由于技能有冷却时间,每次只能选择生命值最少的队友进行保护。

由于队友的数量有点多,ModricWang一下子看不过来,希望你能在1000ms内帮助ModricWang确定需要保护的队友的生命值是多少。

如果所有人生命值都相同,ModricWang会认为大家都处于危险之中,将牺牲自己的生命值发动技能济世之光,为所有人提供灵能护盾。

输入

第一个数为队友数n2<=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个人围坐一个环形(编号从1n),从1号开始,从一个指定数字p每人逐次递增报数,每遇到数字中含有7数字是7的倍数就拍手。当然如果做错的话就gg

王助教打算在他手机安装一个程序,这样他就可以知道轮到自己时,下个需要拍手的数字是多少了。现在由你来实现吧。

输入

三个整数,人数n,王助教的编号i,开始的数字p

1<n100001<n≤10000

1in1≤i≤n

1p23111≤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
表示妹子颜值无法区分。

1n10001≤n≤1000
100xi100−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%)

题目描述

王助教经常会不记得自己多大了,搞不清楚自己是多少岁。王助教把他的生日告诉你,请你计算一下他今天多大了。王助教有强迫症,所以他要知道很精确的年龄。
要精确到天。

规定今天是20161019

王助教在计算年份时,以1019日到上一年的1019日为一整年。
例如20151019日到20141019日为一整年。

王助教在计算月份时,以19日到下月(或上月)的19日为一整月。
例如从519日到619日就算一整月。

王助教还是弹簧手,所以他有可能输入不合法或者不可能的日期,这时请输出Invaild date.

你可以假设王助教能活任意久(但不能活到公元前)。

输入

多组数据读入。
组数至少1组,至多10组。

每组数据一行,包含3个整数y,m,d,依次为王助教生日的年、月、日。

9999y 9999 −9999≤y≤9999 
9999 m≤9999−9999≤m≤9999 
9999 d9999−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。对于闰年需要特殊处理。

合法性判断有两点,首先,日期本身要合法,像170日这种肯定是不合法的。其次,不能来自于未来。

输出上坑了大家,非常抱歉,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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值