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没多久了,要加油啊!

posted @ 2012-10-07 21:57  改名字干什么  阅读(207)  评论(0编辑  收藏  举报