基本思想:
(1) 对加油站按照价格进行排序;
(2)对于每个加油站,判断应该加入的油量(即能够跑的距离进行计算),与现有路程里的进行合并运算。参考Road结构体的建立方式。
可能有case无法通过的情况:
(1) 没有注意到printf有自动四舍五入的功能;
(2) 当无法跑完全程的时候,注意此题是计算最远跑的距离,不是计算能够跑的距离,所以应该从开始往下搜索直到无法抵达某一位置结束。
//1033. To Fill or Not to Fill (25)
//
//基本思想:
// (1) 对加油站按照价格进行排序;
// (2)对于每个加油站,判断应该加入的油量(即能够跑的距离进行计算),与现有路程里的进行合并运算。
// 参考Road结构体的建立方式。
//可能有case无法通过的情况:
// (1) 没有注意到printf有自动四舍五入的功能;
// (2) 当无法跑完全程的时候,注意此题是计算最远跑的距离,不是计算能够跑的距离,所以应该从开始往下搜索直到无法抵达某一位置结束。
//
#include<iostream>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;
typedef struct Station
{
float price;
float Di;
}Station;
typedef struct Road
{
float s;
float e;
float p;
}Road;
bool cmp(Station s1, Station s2)
{
//return (s1.Di < s2.Di);
return (s1.price < s2.price);
}
bool cmp2(Road r1, Road r2)
{
return (r1.s < r2.s);
}
int main(void)
{
#ifdef ONLINE_JUDGE
#else
freopen("D:\\1.txt", "r", stdin);
#endif
float Cmax, D, Davg, N;
scanf("%f %f %f %f", &Cmax, &D, &Davg, &N);
vector<Station> sta;
Station tmp;
int i;
for (i = 0;i<N;i++)
{
scanf("%f %f", &tmp.price, &tmp.Di);
sta.push_back(tmp);
}
sort(sta.begin(), sta.end(), cmp);
int MaxDis = Cmax * Davg;
vector<Road> road;
for (i = 0;i<sta.size();i++)
{
Road tmp;
tmp.s = sta[i].Di;
tmp.e = min(sta[i].Di + MaxDis, D);
tmp.p = sta[i].price;
for (int j = 0;j<road.size();j++)
{
if (tmp.s < road[j].s && tmp.e <= road[j].e && tmp.e >= road[j].s)
{
tmp.e = road[j].s;
}
else if(tmp.s <= road[j].e && tmp.s >= road[j].s && tmp.e > road[j].e)
{
tmp.s = road[j].e;
}
else if(tmp.s >= road[j].s && tmp.e <= road[j].e)
{
tmp.s = tmp.e;
}
}
if (tmp.s >= tmp.e)
{
continue;
}
road.push_back(tmp);
}
float AllDis = 0;
float TotalPrice = 0;
for (i = 0;i<road.size();i++)
{
AllDis += (road[i].e - road[i].s);
TotalPrice += (road[i].e - road[i].s) * road[i].p;
}
if (AllDis != D)
{
sort(road.begin(), road.end(), cmp2);
float startPos = 0;
float endPos = 0;
for (i = 0;i<road.size();i++)
{
if (road[i].s == endPos)
{
endPos = road[i].e;
}
else
break;
}
printf("The maximum travel distance = %.2f", endPos);
}
else
{
printf("%.2f", TotalPrice/Davg);
}
return 0;
}