拯救小鸡
程序员文章站
2024-03-23 18:12:10
...
题目描述
鸡国最近遇到了一件很棘手的事情,经常有一只老鹰想来抓小鸡。经鸡国情报员探查,这只老鹰打算共来袭击 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
TJ
暴力。先枚举,如果能巡逻到当前点的警察不够,再尽量靠近地放够。
BC
var
n,t,x,i,j,sum,ans,a:longint;
f:array[-10000..10000]of boolean;
begin
readln(n,t,x);
if x>t then
begin
writeln(-1);
exit;
end;
for i:=1 to n do
begin
read(a);
sum:=0;
for j:=a-1 downto a-t do if f[j] then inc(sum);
if sum<x then
for j:=a-1 downto a-t do
if f[j]=false then
begin
f[j]:=true;
inc(ans);
inc(sum);
if sum=x then break;
end;
end;
writeln(ans);
end.