题目名称 | 241. [POI 1997] 汽油花费 |
---|---|
输入输出 | pal.in/out |
难度等级 | ★★ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 11 |
题目来源 | BYVoid 于2008-12-17加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:16, 提交:56, 通过率:28.57% | ||||
TARDIS | 100 | 0.081 s | 7.92 MiB | C++ |
这_不错 | 100 | 0.082 s | 7.92 MiB | C++ |
31627012 | 100 | 0.083 s | 7.92 MiB | C++ |
TARDIS | 100 | 0.083 s | 11.75 MiB | C++ |
lbn187 | 100 | 0.093 s | 11.75 MiB | C++ |
liuliuliu | 100 | 0.099 s | 12.74 MiB | C++ |
lingyixiaoyao | 100 | 0.104 s | 14.16 MiB | C++ |
TBK | 100 | 0.130 s | 14.59 MiB | C++ |
StillFantasy | 100 | 0.131 s | 12.03 MiB | C++ |
open the window | 100 | 0.195 s | 6.50 MiB | C++ |
关于 汽油花费 的近10条评论(全部评论) | ||||
---|---|---|---|---|
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.
这_不错
2016-04-14 20:09
2楼
| ||||
自己的贪心策略:(超时两组)
用的bool型标记数组标记路的某位置是否走过(填过), 给油价做一个快排, 每次从最低油价处开始填bool表,每次能填多远就填多远,填一次算一次钱, 填满为止。 摘录的另一种方法:(后改为此方法) 贪心策略:从当前车所在的加油站枚举车加满油后能开多远,在从这段距离中找一个比当前车所在的加油站价格低的加油站,那么当前车只需要开到价格低的加油站的油就足够了,因为到了价格低的加油站加油价格更低。当没有比当前的加油站价格低的则找一个加油价格最低的,当前加满油后开到那个加油价格最低的加油站。如果到达终点则只需要加油加到可以开到终点即可。 摘录的方法果然快…… 发现:把终点的油价置为最小值,并在考虑加油点时考虑终点其实更方便。 |
一些旅行车从城市A到城市B运送包裹。在沿途由很多价格不同的加油站。第一个加油站的位置在路程的开始。旅行车的油箱容积可能不同,车在沿途需要及时给油箱加油,我们假设,每个油站有足够的油。
输入
在文件的第一行为一个整数p表示油箱的容量, 1 < p <= 1000000. 在第二行有一个整数n表是沿途加油站的数目。1 < n <= 1000000.接下来的n行每行有两个用单个正整数分隔的整数ci, di, 其中ci表示第I油站的价格. di 表示I和第(i+1)个油站的距离- (dn 就是最后一个油站到结束点的距离). 1 <= ci <= 1000, 1 <= di <= 1000000.
AB的路线长度(所有di之和) 不超过1000000.
输出
一个整数,为路线AB中加油的最少花费
样例输入
40 3 2 10 1 15 2 5
样例输出
40