题目名称 241. [POI 1997] 汽油花费
输入输出 pal.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 11
题目来源 GravatarBYVoid 于2008-12-17加入
开放分组 全部用户
提交状态
分类标签
贪心
分享题解
通过:16, 提交:56, 通过率:28.57%
GravatarTARDIS 100 0.081 s 7.92 MiB C++
Gravatar这_不错 100 0.082 s 7.92 MiB C++
Gravatar31627012 100 0.083 s 7.92 MiB C++
GravatarTARDIS 100 0.083 s 11.75 MiB C++
Gravatarlbn187 100 0.093 s 11.75 MiB C++
Gravatarliuliuliu 100 0.099 s 12.74 MiB C++
Gravatarlingyixiaoyao 100 0.104 s 14.16 MiB C++
GravatarTBK 100 0.130 s 14.59 MiB C++
GravatarStillFantasy 100 0.131 s 12.03 MiB C++
Gravataropen the window 100 0.195 s 6.50 MiB C++
关于 汽油花费 的近10条评论(全部评论)
orzzz%%%1L大神
Gravataropen the window
2016-08-25 16:24 3楼
求找错。。。。。
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.
Gravatar这_不错
2016-04-14 20:09 2楼
自己的贪心策略:(超时两组)
用的bool型标记数组标记路的某位置是否走过(填过),
给油价做一个快排,
每次从最低油价处开始填bool表,每次能填多远就填多远,填一次算一次钱,
填满为止。
摘录的另一种方法:(后改为此方法)
贪心策略:从当前车所在的加油站枚举车加满油后能开多远,在从这段距离中找一个比当前车所在的加油站价格低的加油站,那么当前车只需要开到价格低的加油站的油就足够了,因为到了价格低的加油站加油价格更低。当没有比当前的加油站价格低的则找一个加油价格最低的,当前加满油后开到那个加油价格最低的加油站。如果到达终点则只需要加油加到可以开到终点即可。
摘录的方法果然快……
发现:把终点的油价置为最小值,并在考虑加油点时考虑终点其实更方便。
GravatarTruth.Cirno
2011-11-05 11:30 1楼

241. [POI 1997] 汽油花费

★★   输入文件:pal.in   输出文件:pal.out   简单对比
时间限制:1 s   内存限制:128 MiB

一些旅行车从城市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