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。