传送门
题面描述:
John有很多头牛,但是它们可能会搞破坏,对此John每天都会记录它们进行破坏的最近天数。例如1表示这些牛一天前进行破坏,2表示两天前进行破坏,0表示当天进行破坏。但是这些记录有些遗失了,用-1表示,-1可能是任意数,现在要求根据这份记录这些牛可能进行破坏次数的最大值和最小值,当然也有可能这份记录本身就矛盾的,如:1 0 3(0表示当天牛进行了破坏,那么它后面就不应该是3而是1),矛盾则输出-1。
题目分析:
首先可以根据记录中不为-1的数 i 确定前 i 天的情况,如果矛盾直接输出 -1 结束,否则把那些大于0的 a[i] 的前 i 天记录改成0。然后开始找最大最小值,最小就是目前所有的 0 表示发生一次破坏,其他非 0 数都指向它前面的某个0。最大值要从后往前找,找到一个大于 0 的数 i 就再往前 i 天,此时不管是 0 还是 -1 都能算一次,直到结束。
代码:
#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
int i,n,a[105];
int main(){
cin>>n;
int minn=0,maxx=0;
for(i=0;i<n;i++) cin>>a[i];
for(i=0;i<n;i++){
if(a[i]!=-1){
if(a[i-a[i]]>0||i-a[i]<0){
cout<<-1;
return 0;
}
else a[i-a[i]]=0;
}
}
a[0]=0;
for(i=0;i<n;i++) if(a[i]==0) minn++;
for(i=n-1;i>=0;i--){
if(a[i]>0) i-=a[i];
if(a[i]==0||a[i]==-1) maxx++;
}
cout<<minn<<' '<<maxx;
}