(纪中)2222. 拯救小鸡(chicken)

本文探讨了一种算法,用于解决鸡国如何有效部署无限数量的警察,以抵御老鹰在特定时间点的多次袭击。警察巡逻时间为固定值,且每次袭击需至少达到指定警察人数。文章分析了输入参数的意义,提供了样例输入输出,并详细解释了解题思路及代码实现。

(File IO): input:chicken.in output:chicken.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet


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


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

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


样例输入
Input1:
3 3 3
2 3 4

Input2:
1 2 3
3

样例输出
Output1:
5

Output2:
-1


数据范围限制
在这里插入图片描述


提示
Sample1:
样例 111 中,老鹰来袭击 333 次,分别在第2,3,42,3,4234 秒时刻,每个警察的巡逻时间为 333 秒,当老鹰来袭击时至少要有 3 名警察才能抵御老鹰的袭击。首先可以在第−1,0,1-1,0,1101 秒三个时刻分别派遣一名警察,抵御老鹰第 222 秒时刻的袭击,然后再在第 2 秒时刻派遣一名警察,连同第 0,10,101 秒两个时刻派遣的警察(此时第−1-11 秒时刻派遣的警察已经休息)就可以抵御老鹰第 333 秒时刻的袭击,最后在第 333 秒时刻派遣一名警察,连同第 1,21,212 秒两个时刻派遣的警察(此时第 000 秒时刻派遣的警察也已经休息)就可以抵御老鹰第 444 秒时刻的袭击,所以至少需要派遣 555 名警察。

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


解题思路
暴力。先枚举,如果能巡逻到当前点的警察不够,再尽量靠近地放够。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int INF=10000;
int n,t,x,ans,a,b[100010],s;
int main(){
   freopen("chicken.in","r",stdin);
   freopen("chicken.out","w",stdout);
    scanf("%d%d%d",&n,&t,&x);
    if(x>t)
    {
        printf("-1");
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        s=0;
        for(int j=a-1;j>=a-t;j--)
            if(b[j+INF])
                s++;
        if(s<x)
            for(int j=a-1;j>=a-t;j--)
            {
                if(!b[j+INF])
                {
                    b[j+INF]=1;
                    ans++;
                    s++;
                    if(s==x)
                    break;
                }
            } 
    }
    printf("%d",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值