Taming the Herd

传送门

题面描述:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yjonben

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值