题意:有一个不精确的计算机,只有当差值大于1的时候才能准确显示正确答案,其余的情况答案不唯一,例如:1>2也是有可能的,现在给出两次计算结果,根据两次计算结果判断D序列是不是符合题意的。
题解:让误差尽量往后移动,例如当1位置对应的是1的时候,这个时候如果2位置对应的是0,说明3对2的影响也是有的,就把2对应位置的数字加1继续往后走,如果2位置对应的是1,说明这个影响是1造成的,就减1,变成0,即当前位置的值不会对之后的数字产生影响。
即如果当前位置是1的话,后面的数要么加一要么减一,如果遍历到大于等于2的时候,这是不可能存在的(只有i-1和i+1会对i产生影响,即只能是0,1,2),直接输出NO,最后判断最后一个数,如果不是0说明这个序列不合法(影响没有全部消除),输出NO,否则输出YES。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
{
if(a[i]>=2) {
cout<<"NO"<<endl;
return 0;
}
if(a[i]==1)
{
if(a[i+1]!=0) a[i+1]--;
else a[i+1]++;
}
}
if(a[n-1]==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}