jlh的童年1【详细解析版】

代码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过。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值