洛谷U1405 problems

OI教練BG在n天中每天早晨會給wxjlzbcd發一套題,其中包含A_i道題目。如果不做的話,題目會累加到下一天。
wxjlzbcd每天能夠刷掉的題目數量爲B_i,BG的題目數量太少,可能不能滿足wxjlzbcd每天刷題的需求,如果題目數量不夠,wxjlzbcd當天就不會刷題,因爲空出來的時間他有可能會浪費掉。
但是wxjlzbcd不想天天頹廢,他想知道自己最多能有多少天有題刷。
輸入輸出格式 Input/output
輸入格式:
輸入第1行爲一個整數n,表示天數。
第2行包括n個數字A_i,表示BG n天中每天發的題目數A_i。
第3行包括n個數字B_i,表示wxjlzbcd n天中每天能刷掉的題目數B_i。
輸出格式:
輸出第1行爲一個整數ans,表示天數。
輸入輸出樣例 Sample input/output
樣例測試點#1 輸入樣例:
5
1 4 1 2 3
1 2 3 4 5
輸出樣例:
4
說明 description
對於40%的數據,保證1≤n≤1000;
對於100%的數據,保證1≤n≤250000,0≤a_i≤10^9,0≤b_i≤10^9。

這是一道經典的貪心題,好像被改編了的樣子。。。。
理解題意是關鍵:這個人如果當天可以刷題的話他也可以選擇不刷,因爲留下今天一天的這些題目可能可以滿足以後多天的需求。所以貌似想到了用堆來維護的樣紙~~~

實現思路:

現在我們用a【i】記錄BG每天發的題目,用b【i】記錄這個人每天的需求。比較每天的需求和所發題數。能刷題的話就刷,不能刷題的話,就在之前刷過題的天中找一個需求量最大的dui【1】與這一天的需求b【i】比較,如果dui【1】>b【i】,那麼就用b【i】去替換那一天,即dui【1】:=b【i】,因爲這樣可以留下更多的題目。

代碼:

var t,tot,n:int64;
    i:longint;
    dui, a,b:array[1..250000]of int64;

procedure up(j:longint);
var i:longint;
begin
  while (j>>1)>=1 do
   begin
     i:=j>>1;
     if dui[i]<dui[j] then
       begin
         t:=dui[i];
         dui[i]:=dui[j];
         dui[j]:=t;
         j:=i;
       end
       else break;
   end;
end;

procedure down(i:longint);
var j:longint;
begin
  while (i<<1)<=tot do
    begin
      j:=i<<1;
      if (j<tot)and(dui[j]<dui[j+1]) then inc(j);
      if dui[i]<dui[j] then
        begin
          t:=dui[i];
          dui[i]:=dui[j];
          dui[j]:=t;
          i:=j;
        end
        else break;
    end;
end;

begin
 readln(n);
 for i:=1 to n do read(a[i]);
 for i:=1 to n do read(b[i]);
 tot:=0;
 for i:=1 to n do
  if a[i]>=b[i]       //能刷題就刷
    then
     begin
      inc(a[i+1],a[i]-b[i]);
      inc(tot);
      dui[tot]:=b[i];
      up(tot);
     end
    else
      begin          //不能刷就比較
        if dui[1]>b[i] then
          begin
            inc(a[i+1],a[i]+dui[1]-b[i]);
            dui[1]:=b[i];
            down(1);
          end
          else inc(a[i+1],a[i]);
      end;
 write(tot);

end.

 評測結果 Result
測試點 #1:通過該測試點。 得分10,耗時0ms,內存3174kB。
測試點 #2:通過該測試點。 得分10,耗時15ms,內存3166kB。
測試點 #3:通過該測試點。 得分10,耗時0ms,內存3170kB。
測試點 #4:通過該測試點。 得分10,耗時0ms,內存3178kB。
測試點 #5:通過該測試點。 得分10,耗時15ms,內存3317kB。
測試點 #6:通過該測試點。 得分10,耗時46ms,內存3633kB。
測試點 #7:通過該測試點。 得分10,耗時156ms,內存4849kB。
測試點 #8:通過該測試點。 得分10,耗時265ms,內存5926kB。
測試點 #9:通過該測試點。 得分10,耗時452ms,內存8093kB。
測試點 #10:通過該測試點。 得分10,耗時312ms,內存8138kB。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章