A1033 25’ 90min 贪心 hard for me
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct station {
double price, dis;
};
vector<station> s;
const int INF = 1000000000;
bool cmp(station a, station b)
{
return a.dis < b.dis;
}
void test()
{
double cmax, d, davg;
int n;
scanf("%lf %lf %lf %d", &cmax, &d, &davg, &n);
station s_temp;
for(int i = 0; i < n; ++i)
{
scanf("%lf %lf", &s_temp.price, &s_temp.dis);
s.push_back(s_temp);
}
s_temp.price = 0;
s_temp.dis = d;
s.push_back(s_temp);
sort(s.begin(), s.end(), cmp);
if (s[0].dis != 0)
cout << "The maximum travel distance = 0.00\n";
else
{
int now = 0;
double ans = 0, nowTank = 0, MAX = cmax*davg;
while (now < n)
{
int k = -1;
double priceMin = INF;
for (int i = now + 1; i <= n&&s[i].dis - s[now].dis <= MAX; ++i)
{
if (s[i].price < priceMin)
{
priceMin = s[i].price;
k = i;
if (priceMin < s[now].price)
break;
}
}
if (k == -1) break;
double need = (s[k].dis - s[now].dis) / davg;
if (priceMin < s[now].price)
{
if (nowTank < need)
{
ans += (need - nowTank)*s[now].price;
nowTank = 0;
}
else
{
nowTank -= need;
}
}
else
{
ans += (cmax - nowTank)*s[now].price;
nowTank = cmax - need;
}
now = k;
}
if (now == n)
printf("%.2f\n", ans);
else
printf("The maximum travel distance = %.2f\n", s[now].dis + MAX);
}
}
int main()
{
test();
system("pause");
return 0;
}