noip2007守望著的逃離 2008.11.5
小結:到每一秒的時候,有三種選擇:1,原地不動,m+4;2.使用魔法m-10,s+10;3.步行
這裡還用到了乙個貪心的策略:只要魔法值》=10,就用魔法,而不是原地呆著。所以,就變成了兩種選擇:1.可以用魔法就用,不能永就原地呆著—魔法選擇(我們把用魔法和不用魔法歸為為一類)
2.步行—不性選擇
為什麼會有這樣乙個貪心策略呢?
t 1 2 3 | 4 5
10(用去)4 8 | 12 (此時就有可以用魔法了,所以,歸到下一次的時間中)
用魔法 當m=10時,可用3s行走60m v1:=20m/s
用步行 17m/s
所以用魔法和原地不動就可以合為一種情況了
心得:1.
遇到像這樣選擇不同的方式有不同的效率的題,就要討論一下哪種方式更合算 2.
有時dp
也可以將幾種情況合併
我的,省去了陣列的:每一秒,只和前一秒有關,所以只用幾下前一秒就行了
program escape;
const fin='escape.in';fout='escape.out';
var m,s,t,ti:longint;
ts,ms1,ms2:longint;
f1,f2:text;
begin
assign(f1,fin);reset(f1);
assign(f2,fout);rewrite(f2);
read(f1,m,s,t);
ms2:=m;ts:=0;ms1:=0;
for ti:=1 to t do
begin
if ms2>=10 then
begin ms1:=ms1+60;ms2:=ms2-10;end
else ms2:=ms2+4;
if ts+17>ms1 then ts:=ts+17 else ts:=ms1;
if ts>=s then
begin writeln(f2,'yes');
writeln(f2,ti);
close(f1);close(f2);
halt;
end;
end;
writeln(f2,'no');
writeln(f2,ts);
close(f1);close(f2);
end.
標稱:
var m,s,t,ti:longint;
ms:array[1..2,0..300000] of longint;
ts:array[0..300000] of longint;
begin
while not eof do
begin
readln(m,s,t);
ms[2,0]:=m;
ts[0]:=0;
for ti:=1 to t do
begin
if ms[2,ti-1]>=10 then
begin
ms[1,ti]:=ms[1,ti-1]+60;
ms[2,ti]:=ms[2,ti-1]-10;
endelse
begin
ms[1,ti]:=ms[1,ti-1];
ms[2,ti]:=ms[2,ti-1]+4;
end;
if ts[ti-1]+17>ms[1,ti] then ts[ti]:=ts[ti-1]+17
else ts[ti]:=ms[1,ti];
if ts[ti]>=s then
begin
writeln('yes');
writeln(ti);
halt;
end;
end;
writeln('no');
writeln(ts[t]);
end;
end.
NOIP2007普及 守望者的逃離
傳送門 普及組的題目 很水。原來寫了乙個模擬不過好像狀態考慮的不全得了80,這次我們考慮一下dp做法。守衛者有兩種移動的方法,一種是閃現,一種是跑,我們可以把閃現和跑分開處理。首先只處理閃現的情況,這個時候要用貪心,能閃就閃,否則原地回藍即可。之後在處理跑步的情況,這種情況就要用dp了,方程很好推,...
noip2007普及組 守望者的逃離 題解
惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者 在與尤迪安的交鋒中遭遇了圍殺,被困在乙個荒蕪的大島上。為了殺死守望者,尤迪安開始對這 個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為 17m s,以這樣的速度是無法逃離荒島的。慶幸的...
2007noip普及組 守望者的逃離
惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變 守望者在與尤迪安的交鋒中遭遇了圍殺.被困在乙個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去,到那時,刀上的所有人都會遇難 守望者的跑步速度,為17m s,以這樣的速度是無法逃離荒島的。慶幸的是守望者...