Codevs P3007 智力大沖浪

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.

暫空

這裏寫圖片描述

發佈了76 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章