由于这里只算前60s的,又有每秒跳一个,假设60秒抽象为数组,每个值为1。根据输入来更新数组,若停下则更新为0。最后对数组求和即可。
代码如下
#include<stdio.h>
#include<stdlib.h>
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<stdio.h>
#include<stdlib.h>
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;
}
我觉得不如第一种方法好想。。。主要这里还有个边界处理。
欢迎大佬分享更优质的方法