83 条题解
-
0厚黑教主 LV 8 @ 2009-10-29 11:22:38
分多种情况考虑,仔细点就能过。
Program p1253;
var d,p,sum,f:array[0..100] of real;
n,i,j:longint;
s,c,dis,pri,k,min:real;
begin
readln(s,c,dis,pri,n);
for i:=1 to n do
readln(d[i],p[i]);
d[0]:=0; d[n+1]:=s;
p[0]:=pri; pri:=0;
for i:=0 to n do
sum[i]:=(d-d[i])/dis;
f[0]:=sum[0]*p[0];
k:=c-sum[0]; min:=p[0];
for i:=1 to n do
begin
if sum[i]>c then begin writeln(-1); halt; end;
if (p[i]k)and(p[i]>min)
then begin
f[i]:=f+k*min+(sum[i]-k)*p[i];
k:=c-sum[i]+k;
min:=p[i];
end;
if (sum[i]min)
then begin
f[i]:=f+sum[i]*min;
k:=k-sum[i];
end;
end;
writeln(f[n]:0:2);
end. -
02009-11-01 17:59:56@
f[i]表示到第i个加油站所用的最小代价(假设终点为第n+1个加油站)。
v[i]表示到第i个加油站时,箱内便宜油(比p[i]便宜)的最大体积。
vv[i]表示v[i]的价值(费用)。
则便宜油单价为vv[i]/v[i]。
从i到j要使得费用最小的话:
1>若p[j]>=p[i],应先用完箱内的便宜油,再尽量多的装入第i个加油站的油.(因为便宜,而且箱内的油不一定要用完,用的时候只需要付出vv[i]/v[i]的费用就行了)
2>若p[j]若vv[i]/v[i]>=p[i],那么就用最小费用到达j,并使油箱为空。
ii>若vv[i]/v[i]c*d2 then break else begin
k:=(d[j]-d[i])/d2;
if p[j]>=p[i] then begin
v[j]:=c-k;
if k>=v[i] then begin
f[j]:=f[i]+vv[i]+(k-v[i])*p[i];
vv[j]:=v[j]*p[i];
end else begin
f[j]:=f[i]+k*vv[i]/v[i];
vv[j]:=(v[i]-k)*vv[i]/v[i]+(v[j]-v[i]+k)*p[i];
end;
end else begin
if k>=v[i] then f[j]:=f[i]+vv[i]+(k-v[i])*p[i] else begin
f[j]:=f[i]+k*vv[i]/v[i];
if vv[i]/v[i]=maxf then writeln('-1') else writeln(f[n]-vv[n]:0:2);
end. -
02009-09-23 09:09:28@
呃...cost每次都加成下一种油了...居然能80!!这个数据...那个弱啊
-
02009-09-13 17:33:24@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0mstype
re=record
di,pi:real;
end;
var
a:array [1..1000] of re;
d1,d2,c,e,p,s,st,v,max,max1,s1:real;
n,i,j,m,l,t,tt:longint;begin
readln(d1,c,d2,p,n);
for i:=1 to n do
readln(a[i].di,a[i].pi);
inc(n);
a[n].di:=d1; a[n].pi:=999999;
st:=c*d2;
s:=0; s1:=0;
v:=p;
while s=d1 then
a[n].pi:=v;
for i:=t+1 to n do
if (a[i].di -
02009-09-11 17:59:57@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msprogram ex;
var i,j,n:longint;
d,c,ans:real;
dis,p:array[1..102]of real;procedure qsort(l,r:longint);
var i,j:longint;
mid,temp:real;
begin
i:=l;j:=r;
mid:=dis[(l+r)div 2];
repeat
while dis[i]mid do dec(j);
if ij;
if i -
02009-08-28 23:52:38@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar d1,c,d2,p0,w,sheng,cost,min:real;
n,i,j,x,q:longint;
d,p:array[0..1000]of real;
begin
readln(d1,c,d2,p0,n);
for i:=1 to n do readln(d[i],p[i]);
d[n+1]:=d1;
p[0]:=p0;
i:=0;
sheng:=0;
while i -
02009-08-27 13:13:47@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar
s,d1,c,d2,p1:real;
k,i,j,n:longint;
d,p:array[0..1000] of real;
begin
readln(d1,c,d2,p1,n);
for i:=1 to n do readln(d[i],p[i]);
d[0]:=0;p[0]:=p1;
d[n+1]:=d1;p[n+1]:=0;
for i:=1 to n+1 do
if d[i]-d>c*d2 then begin writeln('-1');halt; end;
i:=0;
s:=0;
while (ip[i]) do inc(j);
if d[j]-d[i]c*d2) or (d[j]-d[k]>c*d2) do k:=k-1;
s:=s+c*p[i]+((d[j]-d[i])/d2-c)*p[k];
end;
i:=j;
end;
writeln(s:0:2);
end.水的。。。。。水的数据。。。。。
明显有错误的代码,
也ACACAC 。。。 烂死了。。。。。。。。 -
02009-08-23 10:18:30@
郁闷 害我多提交一次 应该输出-1
#include
#includetypedef struct node{
float d;
float j;
float dist;
}NODE;int main()
{
float money,maxoil,totald,speed,price;
float tpdist,minj,tdist,maxdist;
int m,i,j,k;
NODE pnode[100];while(scanf("%f %f %f %f",&totald,&maxoil,&speed,&price)!=EOF)
{
scanf("%d",&m);
for(i = 1; i 0.0;){
for(j=k,minj=pnode[j].j; j pnode[j].j){
k = j;
minj = pnode[j].j;
}
}
if(k == i){
pnode[i].dist += tpdist;
break;
}
for(j=k,tdist=0.0; j < i; j++)
tdist += pnode[j].dist;
if(maxdist-tdist > tpdist)
pnode[k].dist += tpdist;
else
pnode[k].dist += (maxdist-tdist);
tpdist = tpdist + tdist - maxdist;
k++;
}
}
for(money=0.0,i=0; i -
02009-08-16 10:49:42@
感觉程序有点 长,不过秒杀
Program P1253;
var d,p:array[0..1000] of extended;
i,j,n,m:longint;
ans,tot,d1,c,d2,k,rest:extended;
q:boolean;procedure check;
var i,j:longint;
begin
for i:=0 to n do
if d-d[i]>c*d2 then begin writeln('-1'); halt; end;
end;procedure ts;
var i,j:longint;
begin
readln(d1,c,d2,p[0],n);
d[n+1]:=d1; d[n+2]:=d1; p[n+1]:=100000; p[n+2]:=100000;
d[0]:=0; ans:=0; rest:=0;
for i:=1 to n do readln(d[i],p[i]);
end;procedure main;
var i,j:longint;
begin
check;
i:=0;
while ip[i]) and (j -
02009-08-11 21:04:50@
var
d,p:array[0..100]of real;
k,min1,min2,i,j,m,n:longint;
d2,en,s,c,v:real;
begin
read(en,c,d2,p[0],n);
d[n+1]:=en;
for i:=1 to n do
begin
inc(j);
read(d[j],p[j]); p[j]:=p[j];
if d[j]=d[j-1] then
begin
if p[j]c*d2 then begin writeln('-1'); halt end;repeat
min1:=0;min2:=0;
j:=k;
while (j -
02009-08-06 13:29:28@
为什么要改题?搞得我多提交了5次,我的AC率啊...
-
02009-08-06 10:31:48@
少判断一种情况过了3组,
晕了 -
02009-08-03 16:24:57@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
数据较弱
明显错误得过60 -
02009-07-30 23:13:19@
呃。。每个地方的油价竟然一样。。
-
02009-07-30 18:15:29@
我的又一道水题……谢谢支持!查看本题题解及参考代码:http://xujieqi.blog.hexun.com/35618784_d.html访问我的题解库,查询更多题解:http://hexun.com/xujieqi/default.html
-
02009-07-27 12:25:25@
题解(附程序):
-
02009-07-18 13:02:23@
-
02009-07-17 15:49:24@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
...看了题解之后第一次80,原来没有加油站的情况忘了。第二次才AC -
02009-07-14 18:34:30@
program lv;
type
t1=record
price,cc:real;
end;
var
line:array[1..150] of t1;
i,j,k,m,n,tail,head:longint;
price,ccc,min,charge,d,use,cost:real;
c,dis,p:array[0..150] of real;begin
readln(dis[0],ccc,d,p[0],n);
dis[n+1]:=dis[0];
dis[0]:=0;
for i:=1 to n do
readln(dis[i],p[i]);
for i:=0 to n do begin
c[i]:=(dis-dis[i])/d;
if c[i]>ccc then begin
writeln(-1);
halt;
end;
end;
tail:=1;
head:=1;
line[tail].price:=p[0]*2;
line[tail].cc:=ccc;
charge:=0;
for i:=0 to n do begin
head:=tail;
while (head>=1) and (line[head].price>=p[i]) do begin
charge:=charge+line[head].cc;
dec(head);
end;
tail:=head+1;
line[tail].cc:=charge;
line[tail].price:=p[i];
head:=1;
use:=c[i];
while (use>0)and (head=line[head].cc then begin
use:=use-line[head].cc;
cost:=cost+line[head].price*line[head].cc;
inc(head);
end
else begin
line[head].cc:=line[head].cc-use;
cost:=cost+line[head].price*use;
use:=0;
end;
end;
for j:=head to tail do
line[j-head+1]:=line[j];
tail:=tail-head+1;
charge:=c[i];
end;
writeln(cost:0:2);
end. -
02009-06-27 01:44:40@
#include
using namespace std;int main()
{
double c,ps,ds,le,ans=0.0,d[101],p[101];int ct,i,n,j;scanf("%lf%lf%lf%lf",&d[0],&c,&ps,&p[0]);scanf("%d",&n);
for(i=1;i