Codevs P3007 智力大沖浪
題目描述 Description
小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了衆多參賽者,主持人爲了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因爲這些錢還不一定都是你的。接下來主持人宣佈了比賽規則: 首先,比賽時間分爲n個時段(n≤500),它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成(1≤ti≤n)。如果一個遊戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢wi,wi爲自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作爲參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢! 注意:比賽絕對不會讓參賽者賠錢!
輸入輸出 Input&Output
輸入描述 Input Description
輸入共4行。
第一行爲m,表示一開始獎勵給每位參賽者的錢;
第二行爲n,表示有n個小遊戲; 第三行有n個數,分別表示遊戲1~n的規定完成期限;
第四行有n個數,分別表示遊戲1~n不能在規定期限前完成的扣款數。
輸出描述 Output Description
僅1行。表示小偉能贏取最多的錢。
樣例 Sample
樣例輸入 Sample Input
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
樣例輸出 Sample Output
9950
數據範圍及提示 Data Size & Hint
n≤500
1≤ti≤n
分析
該題採用貪心策略,首先扣錢多的肯定要玩,否側會使剩下的錢數減少,所以按照代價排序,代價大的排在前,肯定要在自己的最後期限玩,可以爲其它遊戲讓出時間,然後再開始從前往後掃,因爲是按代價大的在前排序,所以能玩就玩,在最後期限不能玩就向前掃,找到任何一個時間可以玩就玩,如果找不到任何一個時間來玩遊戲,那就讓這個遊戲排到最後,因爲,在任何時間扣錢是一樣的,排在最後可以爲其他遊戲讓出時間。
代碼如下
program p3007;
type rec=record
t,v:longint;
end;
var m,n,i,j:longint;
game:array[1..500] of rec;
can:array[1..500] of boolean;
head,rear:longint;
flag:boolean;
procedure qsort(l,r:longint);
var i,j,mid:longint;
temp:rec;
begin
i:=l;
j:=r;
mid:=game[(i+j)>>1].v;
while i<=j do
begin
while game[i].v>mid do inc(i);
while game[j].v<mid do dec(j);
if i<=j
then
begin
temp:=game[i];
game[i]:=game[j];
game[j]:=temp;
inc(i);
dec(j);
end;
end;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
begin
readln(m);
readln(n);
for i:=1 to n do
read(game[i].t);
for i:=1 to n do
read(game[i].v);
qsort(1,n);
rear:=n;
fillchar(can,sizeof(can),true);
for i:=1 to n do
begin
if can[game[i].t]
then
begin
can[game[i].t]:=false;
end
else
begin
flag:=false;
for j:=game[i].t downto 1 do
begin
if can[j]
then
begin
can[j]:=false;
flag:=true;
break;
end;
end;
if not flag then
begin
m:=m-game[i].v;
can[rear]:=false;
rear:=rear-1;
end;
end;
end;
write(m);
end.