代码A:
#include <stdio.h>
int main(void){
int n,t,i,flag=1,step=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int trap[n][2];
flag=1;
step=0;
for(i=0;i<n;i++){
scanf("%d %d",&trap[i][0],&trap[i][1]);
if(step<trap[i][1]-trap[i][0]) //选取最大步长
step=trap[i][1]-trap[i][0];
}
for(i=0;i<n-1;i++){ //如果跳跃当前陷阱时,掉进下一个陷阱中,或者一次跳跃多个陷阱
if(trap[i][0]+step>trap[i+1][0])
flag=0;
}
printf("%s\n",flag?"YES":"NO");
}
}
注意:
此题有及其不严谨的地方,根据AC过去的代码,意味着陷阱可以不是连续的,例如:(0,3)、(5,6)、(6、7),即数据为:
1
3
0 3
5 6
6 7
此时,程序结果为"NO",分析这段代码
for(i=0;i<n-1;i++){
if(trap[i][0]+step>trap[i+1][0])
flag=0;
}
}
意味着当前陷阱左端加上步长,即每次起跳都是从每个陷阱左边开始,如果陷阱不连续,表示两个陷阱中间未发生跳跃。
带入上述特殊数据,表示:弹珠从0跳到3,再从3滚到5,再从5跳到8,此时flag=0,导致最终结果为"NO";而实际上,应该从0跳到3,再从3跳到6,再从6跳到9,最终本应该为“YES”;
总结A:
陷阱不连续,弹珠不连续跳。能AC过。
代码B:
#include <stdio.h>
int main(){
int t,n,tag,step;
scanf("%d",&t);
while (t--){
tag=1;
step=50000;
scanf("%d",&n);
int trap[n][2];
for(int j=0;j<n;j++){
scanf("%d %d",&trap[j][0],&trap[j][1]);
if(j<n-1&&step>trap[j][1]-trap[j][0])
step=trap[j][1]-trap[j][0]; //找出能跳跃的最小步长
}
for(int j=0;j<n;j++){
if(step+trap[j][0]<trap[j][1])
tag=0;
}
if(tag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
总结B:
陷阱连续,弹珠连续跳。不能AC过。