Gym - 102920E E - Imprecise Computer题解

原题链接


题意

IC出了问题,对于两个差值小于二的数a,b进行大小比较时,有可能输出a >b也有可能输出a <b。
现对于长度为n的数列Pn={1,2,3,…,n}中每个数依次与别的数进行比较,若大于得一分,比赛进行两轮,让你判断输入的数组Dn是否为两场比赛中每个数可能出现的分差。


解析

由于电脑IC可能出现类似1 > 2 的情况并且这种错误会影响到下一个数的分数判断,所以我们的程序就是要判断出出错的地方并消除IC所判断的误差(将误差向后移动),最后判断当前位置的值是否符合题意即可。

以2为例,1的位置对应1时,如果2对应的位置是1,这说明这个误差是由1的误差所影响的,这是将2位置上的数-1。

如果2的位置对应0,这说明程序判断出了2 > 3,则对3产生了影响,那么这是将2位置上的数+1来纠正这个误差。

而如果1的位置上对应为0,则要么两次比赛都判断1 > 2要么都判断1 < 2,虽然判断1 > 2时对于单场比赛会对下一个数产生影响,但两场比赛的影响合起来就被抵消了,因为两场比赛下一个数的分数都会比正确时多1,其差值为0。因此如果这个位置对应的数为0,不会对下一个位置的数产生影响,因此不做判断。

如果这个位置对印过的数出现了 > 1的情况,说明数组有问题,直接输出NO。(当2对应的数为2时,一定说明程序对于前后的数判断都出现了误差,这样的话1所对应的数一定为1,所以当程序判断至1是2所对应的数就已经被-1了)

需要特判的是,当程序跑到第n个位置时,由于n是最后一个数字,若n-1对应的数为1,n对应的数为0或2一定错误,因此最后需要判断n对应的数是否为0。


程序如下

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>

using namespace std;
const int N = 1e6+10

int a[N];
int main(){
    int n; cin>>n;
    for(int i=1;i <=n;i++) cin>>a[i];
    for(int i=1;i<n;++i){
        if(a[i] > 1){ cout<<"NO"<<endl;  return 0;} 
        if(a[i] == 1){
            if(a[i+1]) a[i+1]--;   //这里实际上a[i]也要-1,不过没有这个必要
            else a[i+1]++;
        }
    }
    if(a[n] == 0) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值