2020寒假【gmoj2222】【chicken拯救小鸡】【模拟】

题目描述

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

输入

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

输出

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

样例输入

Input1:

3 3 3
2 3 4

Input2:

1 2 3
3

样例输出

Output1:
5

Output2:
-1

数据范围限制

在这里插入图片描述

提示

Sample1:
样例 1 中,老鹰来袭击 3 次,分别在第 2,3,4 秒时刻,每个警察的巡逻时间为 3 秒,当老鹰来袭击时至少要有 3 名警察才能抵御老鹰的袭击。首先可以在第-1,0,1 秒三个时刻分别派遣一名警察,抵御老鹰第 2 秒时刻的袭击,然后再在第 2 秒时刻派遣一名警察,连同第 0,1 秒两个时刻派遣的警察(此时第-1 秒时刻派遣的警察已经休息)就可以抵御老鹰第 3 秒时刻的袭击,最后在第 3 秒时刻派遣一名警察,连同第 1,2 秒两个时刻派遣的警察(此时第 0 秒时刻派遣的警察也已经休息)就可以抵御老鹰第 4 秒时刻的袭击,所以至少需要派遣 5 名警察。

Sample2:
样例 2 中,老鹰来袭击 1 次,在第 3 秒时刻,每个警察的巡逻时间为 2 秒,但当老鹰来袭击时至少要有 3 名警察才能抵御老鹰的袭击,按照国王派遣警察的原则,无法实现抵御老鹰的任务,输出“-1”。

分析

这题也是模拟,只要判断那个点是否已经派了警察。注意数组前面要空出10000个位置(有负数)。
然后算出当前袭击还缺多少警察,补完就行,时间从后往前。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int ff=10000;//在0之前空出10000个位置可以派警察qwq 
int n,t,x,ans,f,a[100010],sum;
int main()
{
    freopen("chicken.in","r",stdin);
    freopen("chicken.out","w",stdout);
    cin>>n>>t>>x;
    if(x>t)
    {
        cout<<-1;
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>f;
        sum=0;
        for(int j=f-1;j>=f-t;j--)
        {
        	if(a[j+ff]) sum++;
		}
        if(sum<x)
        {
        	for(int j=f-1;j>=f-t;j--)//有效时间 
            {
                if(!a[j+ff])//这个时间点之前不能派过 
                {
                    a[j+ff]=1;//记录这个时间点派了警察 
                    ans++;//派了一个警察 
                    sum++;//增加一个警察 
                    if(sum==x) break;//够数 
                }
            } 
		}
    }
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

发布了110 篇原创文章 · 获赞 100 · 访问量 8010

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/105150556
今日推荐