贪心,很复杂的一个模拟题
ti
#include<bits/stdc++.h>
using namespace std;
#define db double
struct ST{
db p, d;
}st[510];
int D, n;
db cmax, dvag;
bool cmp(ST a, ST b){
return a.d < b.d;
}
int main()
{
while(cin>>cmax>>D>>dvag>>n){
memset(st, 0, sizeof st);
db ans = 0;
bool f = 0;
db cur = 0;
db maxgo = cmax * dvag;
for(int i = 0; i < n; i ++ ) cin>>st[i].p>>st[i].d;
sort(st, st + n, cmp);
if(st[0].d != 0){
cout<<"The maximum travel distance = 0.00"<<endl;
continue;
}
for(int i = 0; i < n; i ++ ){
if(i == n - 1){
db lis = D - st[i].d; //距离终点的距离
if(maxgo >= lis){ //可以到达
if(cur < lis / dvag){
ans += ((lis / dvag) - cur) * st[i].p;
}
}
else{
printf("The maximum travel distance = %.2f", maxgo + st[i].d);
f = 1;
}
break;
}
//如果不是最后一个加油站
if(st[i + 1].d - st[i].d > maxgo){
printf("The maximum travel distance = %.2f\n", maxgo + st[i].d);
f = 1;
break;
}
int idx = i;
for(int j = i + 1; j < n; j ++ ){
if(st[j].d - st[i].d <= maxgo ){ //当前油能到达下一个更便宜的加油站
if(st[j].p < st[i].p){
idx = j;
break;
}
}
else break;
}
if(idx == i){ //如果当前就是应该加油的油站
if((D - st[i].d) <= maxgo){
if(cur < (D - st[i].d) / dvag){
ans += ((D - st[i].d) / dvag - cur) * st[i].p;
}
break;
}
db uu = cmax - cur;
ans += uu * st[i].p;
cur = cmax - (st[i + 1].d - st[i].d) / dvag;
}
else{
db diu = (st[idx].d - st[i].d) / dvag;
if(cur >= diu){
cur -= diu;
}
else{
db ii = diu - cur;
ans += ii * st[i].p;
cur = 0;
}
i += idx - i - 1;
}
}
if(!f) printf("%.2f\n", ans);
}
return 0;
}