【普及模拟】生产武器

来源:互联网 发布:mysql eq ref 编辑:程序博客网 时间:2024/04/28 00:08
               【普及模拟】生产武器 

题目:
最近,飞过海在OI总部总算弄了个小差,现在他又被调去了OI防卫部门来制造对付基德的工具。当然,这些工作是在OI总部内的机器上进行的,可是飞过海从来没有此经验,现在飞过海又接到了一批新的任务,现在他要编程来控制机器。已知机器一天工作N mins,当飞过海按动开始按钮的时候机器就开始运转。

现在OI总司给了K个生产目标,可是只有一台机器,所以总司希望知道最少机器能生产多少个零件(也就是最少工作多少分钟)。如果同时有许多的零件要加工,机器只能选择一个。但是一个零件任务是有时间限制的,也就是说,1个零件必须从P分开始,持续T分钟(好牵强的规定啊!)。

由于飞过海很忙,所以请你来编写一下这个程序吧!

输入:
输入文件中的第一行为两个整数N,K(1<=N<=10000000,1<=K<=100000),其中:N表示机器的运转时间(由于机器要维护,它只能工作那么多时间),单位为分钟,K表示总司布置的零件总数。
接下来的K行,每行有两个整数P,T,表示该任务从第P分钟开始,持续时间为T分钟。

输出:
输出文件中仅一行为一个数,表示机器最多可能加工零件的最少时间。

鄙视出题人的语文+1
这道题难就难在理解题目上
其实理解了题目就很好做了
首先题目大意:
一个人,他连续工作n单位时间
当接到一个任务时,如果他手头上没有任务,则必须接受,花费一定的单位时间去完成
如果手头上有任务,则不用接受
现在求他最少的工作时间(则最少花费多少单位时间在完成任务上)

首先我们设f[i]为从第i个单位时间到第n个时间最多有多少时间是可以“偷懒”的
转移方程也呼之欲出了:
a[k][1]!=i:f[i]=f[i+1]+1;
a[k][1]==i:
while(a[k][1]==i)
{
f[i]=max(f[i],f[i+a[k][2]);
k–;
}
最后输出n-f[1]

标程:
var a:array[0..100000,1..2]of longint;
f:array[0..20000001]of longint;
n,k,i,t,j,l,x,s:longint;
function max(a,b:longint):longint;
begin if a>b then exit(a) else exit(b); end;
begin
assign(input,’produce.in’);
assign(output,’produce.out’);
reset(input);
rewrite(output);
readln(n,k);
for i:=1 to k do
readln(a[i,1],a[i,2]);
f[n+1]:=0;
for i:=n downto 1 do
begin
f[i]:=0;
if a[k,1]<>i then f[i]:=f[i+1]+1
else
begin
while(a[k,1]=i)and(k>0)do
begin
if f[i+a[k,2]]>f[i] then
f[i]:=f[i+a[k,2]];
dec(k);
end;
end;
end;
writeln(n-f[1]);
close(input);
close(output);
end.

原创粉丝点击