SWUST-跳绳比赛

SWUST-跳绳比赛_第1张图片

由于这里只算前60s的,又有每秒跳一个,假设60秒抽象为数组,每个值为1。根据输入来更新数组,若停下则更新为0。最后对数组求和即可。

代码如下

#include
#include
int main() {
    int n;
    scanf("%d", &n);
    while (n--) {
        int arr[60] = { 0 };
        int t, p = 0, sum = 0;
        scanf("%d", &t);
        int* ptr = (int*)malloc((t + 1) * sizeof(int));
        for (int i = 0; i < t + 1; i++) ptr[i] = 0;
        for (int i = 1; i <= t; i++) {
            scanf("%d", ptr + i);
            p += (ptr[i] - ptr[i - 1]);
            if (p <= 59) {
                for (int j = p; j <= p + 2; j++) {
                    arr[j] = 1;
                }
                p += 3;
            }
        }
        for (int i = 0; i < 60; i++) {
            if (arr[i] != 1)
                sum++;
        }
        printf("%d\n", sum);
    }
    return 0;
}

好吧,虽然能过,但是很不推荐这种方法。。。

再观察一下题目,现在我们把数组丢掉。直接从每次停下时入手,其实我们只需要找出60秒内停下次数就可以,结果就是60-停下次数*3.那么停下次数怎么找呢?首先当前时间和60进行比较,如果最后一次当前时间未到60秒,那么次数就是n

        如果某一次当前时间超过60秒,那么次数计到上一次为止。可以证明60秒时一定处于这二次跳停之间。

        然后发现一个问题:比如第五次停下时累计跳了47次,算当前时间就是62。我们计4次,结果为48,但是实际为47,为什么呢?

        我们来回忆一下过程,可以发现问题就是错误的认为所有情况中这个停下时间段都没有被60秒时截断。处理为截断时就取累计跳数

代码如下

#include
#include
int main() {
    int n;
    scanf("%d", &n);
    while (n--) {
        int t;
        scanf("%d", &t);
        int* ptr = (int*)malloc((t + 1) * sizeof(int));
        for (int i = 1; i <= t; i++) 
            scanf("%d", ptr + i);
        if (ptr[t] + t * 3 <= 60) {
            printf("%d\n", 60-t*3);
        }
        else {
            for (int i = 1; i <= t; i++) {
                int tim = ptr[i] + i * 3;
                if (tim >= 61 && tim <= 62) {
                    printf("%d\n", ptr[i]);
                    break;
                }
                else if (tim > 62) {
                    printf("%d\n", 60 - (i - 1) * 3);
                    break;
                }   
            }
        }        
    }
    return 0;
}

我觉得不如第一种方法好想。。。主要这里还有个边界处理。

欢迎大佬分享更优质的方法 

你可能感兴趣的:(SWUST,OJ,#期末真题/转专业题,算法,数据结构)