vijos p1253(旅行家的预算)
贪心算法,纠结了好久,昨天开始做,大概思路是 每到一站比一次,若有比这个油价小的,加到正好可以到那个加油站的油,如果不行就加满!
1 program p1253; 2 var 3 s,d1,d2,c,q2,w,now,k,p0:real; 4 n,i,j,l,m,q,past:longint; 5 d:array[0..110] of real; 6 p:array[0..110] of real; 7 begin 8 assign(input,'haha.in'); 9 reset(input); 10 read(d1,c,d2,p0,n); 11 for i:=1 to n do 12 begin 13 read(d[i]); 14 read(p[i]); 15 end; 16 close(input); 17 k:=d2*c; 18 i:=1; 19 j:=0; 20 if n=0 then begin 21 if d1<=k then begin s:=p0*d1/d2; write(s:0:2);end 22 else write('-1'); 23 end 24 else begin 25 while (d[i]<=k) do 26 begin 27 if p[i]<=p0 then begin j:=i; break; end; 28 inc(i); 29 end; 30 if d[i]>k then begin write('-1'); end 31 else begin 32 if j<>0 then begin s:=(d[j]/d2)*p0; now:=(d[j]/d2);end 33 else begin s:=c*p0; now:=c; end; 34 j:=j-1; 35 past:=0; 36 repeat 37 inc(j); 38 if j<=n then begin 39 now:=now-((d[j]-d[past])/d2); 40 if (abs(now)>0.0001)and(now<0) then begin write('No Solution'); halt; end; 41 i:=j+1; 42 q:=0; 43 while(i<=n) and ((d[i]-d[j])<=d2*c)do 44 begin 45 if(p[i]<=p[j]) then begin q:=i; break; end; 46 inc(i); 47 end; 48 if q<>0 then begin s:=s+((d[q]-d[j])/d2)*p[j]; now:=now+((d[q]-d[j])/d2); end 49 else begin 50 if i<=n then begin s:=s+(c-now)*p[j]; now:=c; end 51 else begin if (d1-d[j])/d2<=now then 52 else if (d1-d[j])/d2<=c then begin 53 s:=s+((d1-d[j])/d2-now)*p[j]; now:=now+((d1-d[j])/d2)end 54 else begin if j=n then write('No Solution') 55 else begin w:=900000000000; 56 while i>j+1 do begin 57 dec(i); 58 if p[i]<=w then 59 begin 60 w:=p[i]; 61 m:=i; 62 end; 63 end; 64 i:=m; 65 s:=s+(c-now)*p[j]; now:=c end; 66 end; 67 end; 68 end; 69 end; 70 past:=j; 71 j:=i-1; 72 until(j=n); 73 write(s:0:2); 74 end; 75 end; 76 end.
要记录油量,感觉不够细心,NOIP没多久了,要加油啊!