中石油 2017暑假 拯救小鸡

3635: 拯救小鸡

时间限制: 1 Sec   内存限制: 128 MB
提交: 87   解决: 42
[ 提交][ 状态][ 讨论版]

题目描述

鸡国最近遇到了一件很棘手的事情,经常有一只老鹰想来抓小鸡。经鸡国情报员探查,这只老鹰打算共来袭击 n 次,第 i 次来的时刻为第 t i  (1≤i≤n)  秒时刻。 
鸡国国王为了保护鸡国中的小鸡,决定派出鸡国警察(鸡国有无穷多个警察)来巡逻。
每个警察巡逻的时间长度都为 t 秒。当老鹰来袭击的时刻至少要有 x 名警察才能抵御老鹰的袭击。另外国王派遣警察有两个原则: 
(1)每个时刻最多只能派遣一名警察。在第 0 秒时刻及第 0 秒之前的时刻(鸡国有负数时刻)也可以事先准备派遣警察,但每个时刻最多也只能派遣一名警察。 
(2)延迟 1 秒执行巡逻任务。第 i 秒时刻派遣的警察,在第 i+1 到 i+t 秒时刻执行巡逻任务。 
为帮助国王节省开支,请帮忙计算至少需要派遣多少名警察才能保证鸡国小鸡不被老鹰抓走? 

输入

输入共 2 行。 
第 1 行输入三个整数 n,t,x,分别表示老鹰总共袭击次数,每个警察巡逻的时间长度为,以及某个时刻能抵挡住老鹰袭击的最少警察数量。 
第 2 行 n 个严格升序排列的正整数 t i  (1≤i≤n),表示第 t i 秒时刻老鹰会发动袭击。 

输出

输出 1 行一个整数,表示总共至少需要派遣多少个警察才能抵御老鹰的 n 次袭击,如果出现无法抵御老鹰的袭击时,输出“-1”(不包含双引号)。 

样例输入

3 3 3
2 3 4

样例输出

5

提示

来源






模拟题,一开始纳美什么时候无法抵御,想了半天,就是停留的时间小于他需要的警察数,自己品味下


ac代码



#include <stdio.h> 
#include <cmath>
#include <cstring>
#include <algorithm>

using namespace std;

int n,t,x;
int a[1000005];
int vis[1000005];
int vis_f[1000005];
int main()
{
	while(~scanf("%d%d%d",&n,&t,&x)){
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		memset(vis,0,sizeof(vis));
		memset(vis,0,sizeof(vis_f));
		int cnt=0;
		if(t < x)
			cnt=-1;
		else
			for(int i=0;i<n;i++){
				int tmp_x=x;
				while(tmp_x){
					if(a[i]-tmp_x < 0 ){
						if(!vis_f[a[i]-tmp_x]){
							vis_f[a[i]-tmp_x]=1;
							cnt++;	
						}
					}
					else{
						if(!vis[a[i]-tmp_x]){
							vis[a[i]-tmp_x]=1;	
							cnt++;
						}
					}
					tmp_x--;
				}
			}
		printf("%d\n",cnt);
	}
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值