orzzz%%%1L大神
|
|
求找错。。。。。
program www; const maxn=1000000; var heap,c,d,di:array[0..maxn]of longint; len,i,n,tmp,p,sum,j,px,tot,fur,wu,k,i1:longint; procedure put(x:longint); var fa,son,tmp:longint; begin inc(len); heap[len]:=x; son:=len; while(son<>1)and(heap[son div 2]>heap[son])do begin tmp:=heap[son div 2]; heap[son div 2]:=heap[son]; heap[son]:=tmp; son:=son div 2; end; end; function get:longint; var fa,son,tmp:longint; begin get:=heap[1]; heap[1]:=heap[len]; len:=len-1; fa:=1; while(fa*2<=len)or(fa*2+1<=len)do begin if (fa*2+1>len)and(heap[fa*2]<heap[fa*2+1]) then son:=fa*2 else son:=fa*2+1; if heap[fa]>heap[son] then begin tmp:=heap[fa]; heap[fa]:=heap[son]; heap[son]:=tmp; fa:=son; end else break; end; end; procedure kong; var i:longint; begin for i:=1 to maxn do heap[i]:=0; end; begin assign(input,'pal.in');reset(input); assign(output,'pal.out');rewrite(output); readln(p); readln(n);tot:=0;sum:=0; for i:=1 to n do readln(c[i],d[i]); c[n+1]:=-1; di[0]:=0; for i:=1 to n do di[i]:=di[i-1]+d[i]; d[n+1]:=maxlongint; i:=1;i1:=0; while tot<di[n] do begin put(c[i]); fur:=p; for j:=i to n+2 do begin if fur>0 then begin fur:=fur-d[j]; if j<>i then put(c[j]); end else break; end; wu:=get; if wu<>-1 then begin wu:=get; for k:=i to n do if c[k]=wu then break; sum:=sum+(di[k-1]-di[i-1])*c[i]; tot:=di[k-1]; i:=k; kong; end else begin wu:=get; if wu<>0 then begin for k:=i to n do if c[k]=wu then break; sum:=sum+(di[k-1]-di[i-1])*c[i]; tot:=di[k-1]; i:=k; sum:=sum+(di[n]-di[i-1])*c[i]; tot:=di[n]; end else begin sum:=sum+(di[n]-di[i-1])*c[i]; tot:=di[n]; end; end; end; writeln(sum); close(input); close(output); end.
题目 241 [POI 1997] 汽油花费
2016-04-14 20:09:02
|
|
自己的贪心策略:(超时两组)
用的bool型标记数组标记路的某位置是否走过(填过), 给油价做一个快排, 每次从最低油价处开始填bool表,每次能填多远就填多远,填一次算一次钱, 填满为止。 摘录的另一种方法:(后改为此方法) 贪心策略:从当前车所在的加油站枚举车加满油后能开多远,在从这段距离中找一个比当前车所在的加油站价格低的加油站,那么当前车只需要开到价格低的加油站的油就足够了,因为到了价格低的加油站加油价格更低。当没有比当前的加油站价格低的则找一个加油价格最低的,当前加满油后开到那个加油价格最低的加油站。如果到达终点则只需要加油加到可以开到终点即可。 摘录的方法果然快…… 发现:把终点的油价置为最小值,并在考虑加油点时考虑终点其实更方便。 |