思路
贪心经典题。要把所有的加油站先排序,之后扫一遍,每一个加油站是否加油主要看从这个加油站开始,能走的路程里面是否存在一个比这个加油站便宜的:
- 如果存在,找到第一个比他便宜的,加油加到这里;
- 如果不存在,就把油加满,走到哪里算哪里。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef double db;
struct node{
db dis, val;
bool operator < (const node & a)const{
return dis == a.dis ? val < a.val : dis < a.dis;
}
};
node p[110];
db d1, c, d2, p1, max_dis = 0;
int n, t;
int main(){
cin >> d1 >> c >> d2 >> p1 >> n;
max_dis = c * d2;
p[++t].dis = 0, p[t].val = p1;
p[++t].dis = d1, p[t].val = 0;
t ++;
for(int i = 1; i <= n; i ++, t ++)
cin >> p[t].dis >> p[t].val;
t --;
sort(p+1, p+1+t);
db left = 0, cost = 0;
for(int i = 1; i < t; i ++){
int to = i, pos;
db min_cost = p[i].val;
left -= ((p[i].dis - p[i-1].dis) / d2);
while(p[to+1].dis - p[i].dis <= max_dis){
to ++;
if(p[to].val < min_cost){
min_cost = p[to].val;
pos = to;
break;
}
}
if(to == i){
printf("No Solution");
return 0;
}
if(min_cost >= p[i].val){
cost += (c-left) * p[i].val;
left = c;
}else if(left*d2 < p[pos].dis - p[i].dis){
db tt = ((p[pos].dis - p[i].dis) / d2 - left);
cost += tt * p[i].val;
left += tt;
}
}
printf("%.2f", cost);
return 0;
}
光看初赛了,好久不写了,写的真丑。。。