CCF-小明种苹果(续)
\qquad 写在前面的话:这个题目是我第一次参加CCF这个比赛的试题,但是当时并没有做出来,时隔两年做这一题,感悟如下:题目本身并不困难,没有复杂的算法过程,只需要模拟即可。但是即使现在做我也不是一次AC的,所以这篇博客主要的目的就是用于记录这个错误。题目的PDF文档我放在了本文的最后位置,AC的代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2000 + 5;
int a[maxn], sign[maxn];
signed main(){
int N;
scanf("d", &N);
int temp;
for(int i = 0; i < N; i++){
int M;
scanf("%d", &M);
for(int j = 0; j < M; j++){
scanf("%d", &temp);
if(temp > 0){
if(j == 0) a[i] = temp;
else{
if(temp != a[i]){
sign[i] = 1;
a[i] = temp;
}
}
}
else a[i] += temp;
}
}
int T = 0, D = 0, E = 0;
for(int i = 0; i < N; i++){
T += a[i];
if(sign[i] == 1) D++;
//***********************//
if(sign[i] == 1 && sign[(i + 1) % N] == 1 && sign[(i + 2) % N] == 1)
/************************//
E++;
}
printf("%d %d %d\n", T, D, E);
return 0;
}
\qquad 代码主体我不做分析了,认真看都看的懂。注意看代码中我使用***********//包括起来的部分——if(sign[i] == 1 && sign[(i + 1) % N] == 1 && sign[(i + 2) % N] == 1),这一条语句在代码中的作用的用于检测是否连续的三个苹果都有掉果子的现象发生。但是我一开始写的语句是这样的—— if(sign[i] == 1 && sign[(i + 1) % N] == 1 && sign[(i - 1) % N] == 1),与正确的语句唯一的不同时将(i + 2) % N; 改写为了(i - 1) % N;好像是完成的同一个功能但是却存在一个BUG——当i是0的时候i - 1就等于-1,此时-1对N求余将得到-1(我希望得到的肯定是N-1),所以这是一个错误,也导致第一轮只得到了80分。
关于-1对一个整数求余还是得到-1的结论,感兴趣的朋友可以亲自在电脑上试一下。
题目的PDF如下,有两个【样例1输入】请忽略第一个,或者可以直接上官网查看原题http://118.190.20.162/view.page?gpid=T93