UPC新生训练赛32场

B远足活动

题目描述

小明决定徒步完成一个N天的远足登山活动。第一天他带上一个大睡袋和足够的食物,从大本营出发。大本营的海拔高度为0,在第N天,他必须回到大本营。在这N天中,他可以在他的大睡袋和简易的帐篷中入睡。
在每天的登山活动中,他可以选择向山顶出发,也可以选择下山(同一天只能选择一种方式),而且有如下两条规则:
1、在登山过程中,他不能走的太快,海拔的升高的过程,空气的含氧量会发生变化,因此每天只能上升A米的海拔。
2、在下山过程中,他也不能走的太快,否则他的膝盖无法承受冲击。每天他只能下降B米的海拔。
例如:某天早晨小明处在470米的海拔位置,A=100且B=200,那么他在这天中可以向上到达570米的位置,也可以下山达到海拔270米的位置,因此一天结束后,他可能处在的海拔位置在270~570米之间。
现在,给定N,A和B,问小明最多能到达海拔多少米的高度。

输入

第一行三个整数,N,A和B,表示N天的登山远足活动,每天可以向上爬海拔A米,也可以下山下降海拔B米。

输出

输出一个整数,表示在第N天中能到达的最高海拔高度。

样例输入 Copy

【样例1】
3 7 10
【样例2】
5 40 30

样例输出 Copy

【样例1】
10
【样
80

提示

样例1解释:第一天向上爬7,第二天向上爬3到达海拔10,第三天回到大本营。
样例2解释:第一天和第二天分别向上爬40,后面3天下山分别30+30+20


对于50%的数据,2<=n<=20,1<=A,B<=50
对于100%的数据,2<=n<=50,1<=A,B<=50

做这个题的原则:一步一步走, 能上就上。

代码段:

#include <iostream>
using namespace std;
int main() {
    int n, a, b, i, sum = 0;
    cin >> n >> a >> b;
    for (i = 1; i <= n; i++) {
        if (a * i >= b * (n - i) && a * i - b * (n - i) <= a) {
            sum = b * (n - i);
        }
        if (a * i <= b * (n - i) && b * (n - i) - a * i <= b) {
            sum = a * i;
        }
    }
    cout << sum;
}

核心的判断部分:

if (a * i >= b * (n - i) && a * i - b * (n - i) <= a) {

            sum = b * (n - i);

        }

        if (a * i <= b * (n - i) && b * (n - i) - a * i <= b) {

            sum = a * i;

        }

问题C:

这个题目比较离谱(主要是我把能踩的都踩了)

注意的事情是, 尽量少用cin 或者说直接 ios::sync_with_stdio(false)关掉同步, 再就是不要一边边地用strlen, 这破玩意容易超时啊。 这边直接建议 s.length(), 或者是定义一个k, 用来储存长度。

给出两个代码哈, 一个是cstring , 另一个是string

#include <cstring>
#include <iostream>
using namespace std;
int main() {
    int i, j;
    char op[1000010];

    scanf("%s", op);
    int k = strlen(op);
    int max = 1, cnt = 1;
    for (i = 1; i < k; i++) {
        if (op[i] == op[i - 1]) cnt = 1;
        else cnt++;
        if (cnt > max) max = cnt;
    }
    printf("%d", max);
}

另外一种

#include<iostream>
#include<string>
using namespace std;

int main()
{
        char c;
        string s;
        cin >> s;
        int curLength = 1;
        int maxLength = 1;
        for (int i = 1; i < s.length(); i++)
        {
                if (s[i] == s[i - 1])
                {
                        curLength = 1;
                }
                else
                {
                        curLength++;
                }
                if (curLength > maxLength)
                {
                        maxLength = curLength;
                }
        }
        cout << maxLength << endl;

        cin >> c;
}

问题J:

问题 J: 贪睡虫

时间限制: 1.000 Sec  内存限制: 128 MB
提交 状态

题目描述

你是个贪睡虫,有一天被老师逮个正着,这个老师很有意思,提出一个问题:“给定入睡时刻和起床时刻,计算一共睡了多长时间”,如果回答正确就可以免于处罚。入睡时刻和起床时刻都采用24小时制表示法(见备注),而且知道睡觉时间最少为1秒,最多为24小时。

输入

输入第一行描述入睡时刻,第二行描述起床时刻,两个时刻都是采用“HH:MM:SS”,其中“HH”表示时,范围为0到23,“MM”表示分,范围为0到59,“SS”描述秒,范围为0到59。注意即使时分秒只有一位数也要通过加0补齐两位。

输出

输出一共睡了多长时间。格式同输入一样。

样例输入 Copy

20:00:00
04:00:00

样例输出 Copy

08:00:00

提示

24小时制,是一种时间的表示方法。以区别于12小时制。
在24小时制中,下午1点被写成13点,下午2点被写作14点。
尽管,在生活中,我们使用更多的是12小时制。比如我们说,下午5点下班。我们说的,“朝9晚5”是指的是,上午9点和下午5点(普通职员上下班的时间)。但在科学严谨的说明中,在合同等法律文书中,时间要写成24小时制。 
 输入可以优化: scanf("%d:%d:%d", &a, &b, &c)减少字符串的处理。

#include <iostream>
using namespace std;
char op[10], bp[10];
int main() {
    scanf("%s", op);
    scanf("%s", bp);
    int a, b, c, d, e, f;
    a = (op[0] - '0') * 10 + op[1] - '0';
    d = (bp[0] - '0') * 10 + bp[1] - '0';
    b = (op[3] - '0') * 10 + op[4] - '0';
    e = (bp[3] - '0') * 10 + bp[4] - '0';
    c = (op[6] - '0') * 10 + op[7] - '0';
    f = (bp[6] - '0') * 10 + bp[7] - '0';
    //cout << a << ' ' << b << ' ' << c << endl;
    //cout << d << ' ' << e <<' ' << f << endl;
    if (f < c) {
        e--;
        f += 60;
    }
    if (e < b) {
        d--;
        e += 60;
    }
    if (d < a) {
        d += 24;
    }
    if (d - a == 0 && e - b == 0 && f - c == 0) printf("24:00:00");
    else printf("%02d:%02d:%02d", d - a, e - b, f - c);
    //cout << d - a << ':' << e - b << ':' << f - c;
    return 0;
}

 

问题 K: 羊羊整除

时间限制: 1.000 Sec  内存限制: 128 MB
提交 状态

题目描述

羊年到了,村长开始教小羊学习Pascal语言,刚开始学习四则运算。村长在白板上写下两个整数16和3,问小羊们,有16只羊,平均分到3个羊村,每个羊村分到的数量必须相同,这个分配的数量最大是多少?小羊们很快就得到了答案,每个羊村分到5只,有1只羊就只能落单了。村长在白板上写下5。没错,这个就是Div(整除)的用法!
为了检验小羊们是否掌握了整除运算,村长要求小羊们轮流从白板上任意选取两个不同的数,由大数整除小数,若所得结果没有出现在白板上,就将该值写在白板上。直到小羊们再也找不到没出现过的整数。
虽然这样上课很锻炼小羊们的运算能力,但是课堂时间有限。为了控制课堂时间,村长想要知道,根据当前白板上的数字,最终白板上会出现几个数字?现在请你帮他编写一个程序快速计算一下吧!

输入

第一行一个整数N,表示当前白板上出现的整数个数。
第二行N个整数,中间用空格分隔,表示当前在白板上的数字,保证每个数字都不相同。

输出

输出一个整数,表示最终白板上数字的个数。

样例输入 Copy

【样例1】
2
16 3
【样例2】
3
17 2 1

样例输出 Copy

【样例1】
4
【样例2】
5

提示

【样例1解释】
选择16和3,写下5;选择5和3,写下1;共16,3,5,1,四个整数。

【样例2解释】
选择17和2,写下8;再选择8和2,写下4;共17,2,8,4,1,五个整数。

【数据范围】
50%的数据,N<=50;
100%的数据,N<=100,1<=ai<=100。

这个题根据数据的范围进行处理。 主要是数据比较大, 老老实实套循环啊哈

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, i, j, maxm = 0;
    int a[110];
    memset(a, 0, sizeof(a));
    cin >> n;
    for (i = 1; i <= n; i++) {
        scanf("%d", &j);
        a[j] = 1;
        maxm = max(maxm, j);
    }
    for (i = maxm; i >= 1; i--) {
        if (a[i] == 1) {
            for (j = i; j >= 1; j--) {
                if (a[j] == 1) {
                    a[i / j] = 1;
                }
            }
        }
    }
    //cout << maxm << endl;
    int cnt = 0;
    for (i = 1; i <= maxm; i++) {
        if (a[i] == 1) {
            cnt++;
            //cout << i << endl;
        }
    }
    cout << cnt;
    return 0;
}

核心代码就是这一段:

for (i = maxm; i >= 1; i--) {
        if (a[i] == 1) {
            for (j = i; j >= 1; j--) {
                if (a[j] == 1) {
                    a[i / j] = 1;
                }
            }
        }
    }

咱就感觉离谱(反正自己还是一如既往的菜, run了run了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值