Gravatar
open the window
积分:580
提交:238 / 614
orzzz%%%1L大神

Gravatar
这_不错
积分:260
提交:141 / 425
求找错。。。。。
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
Truth.Cirno
积分:1591
提交:557 / 1253
自己的贪心策略:(超时两组)
用的bool型标记数组标记路的某位置是否走过(填过),
给油价做一个快排,
每次从最低油价处开始填bool表,每次能填多远就填多远,填一次算一次钱,
填满为止。
摘录的另一种方法:(后改为此方法)
贪心策略:从当前车所在的加油站枚举车加满油后能开多远,在从这段距离中找一个比当前车所在的加油站价格低的加油站,那么当前车只需要开到价格低的加油站的油就足够了,因为到了价格低的加油站加油价格更低。当没有比当前的加油站价格低的则找一个加油价格最低的,当前加满油后开到那个加油价格最低的加油站。如果到达终点则只需要加油加到可以开到终点即可。
摘录的方法果然快……
发现:把终点的油价置为最小值,并在考虑加油点时考虑终点其实更方便。