題目描述
雞國最近遇到了一件很棘手的事情,經常有一隻老鷹想來抓小雞。經雞國情報員探查,這隻老鷹打算共來襲擊 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;
}