题解:P1016 [NOIP 1999 普及组/提高组] 旅行家的预算
__DATI__ghc___ · · 题解
P1016 [NOIP 1999 普及组/提高组] 旅行家的预算 题解
题意解析
给定起点到终点的距离 No Solution。
做法
贪心。将终点视为第 No Solution。直到到达为止。
代码
#include<bits/stdc++.h>
using namespace std;
double s,c,l,p0,ans;
int n;
double d[10],p[10];
int main()
{
cin>>s>>c>>l>>p0>>n;
if(s==0)
{
cout<<"0.00"<<endl;
return 0;
}
for(int i=1; i<=n; i++) cin>>d[i]>>p[i];
d[0]=0;
p[0]=p0;
d[n+1]=s;
p[n+1]=0;
n++;
double o=0;
double maxd=c*l;
if(maxd==0)
{
cout<<"No Solution"<<endl;
return 0;
}
for(int i=0; i<n; i++)
{
if(d[i+1]-d[i]>maxd)
{
cout<<"No Solution"<<endl;
return 0;
}
double m=p[i+1];
int id=i+1;
for(int j=i+1; j<=n&&d[j]-d[i]<=maxd; j++)
{
if(p[j]<p[i])
{
id=j;
m=p[j];
break;
}
if(p[j]<m)
{
m=p[j];
id=j;
}
}
if(m<p[i])
{
double f=(d[id]-d[i])/l;
if(o<f)
{
ans+=p[i]*(f-o);
o=f;
}
o-=(d[id]-d[i])/l;
i=id-1;
}
else
{
ans+=p[i]*(c-o);
o=c;
o-=(d[i+1]-d[i])/l;
}
}
cout<<fixed<<setprecision(2)<<ans<<endl;
return 0;
}
完
感谢阅读。