PAT (Advanced) 1033. To Fill or Not to Fill (25)
2018-02-27 21:44
393 查看
原题:1033. To Fill or Not to Fill (25)
解题思路:
贪心法。每在一个站都有如下情况:
1)刚出发时,第一个加油站不在0点,直接退出;
2)从当前加油站的后一个加油站在行驶距离内开始向前搜索,比较价格,直到找到价格比当前低的第一个加油站或者后续加油站中最便宜的;
3)找到的加油站价格比当前高,先检查能否直接到达目的地, 若能,加足够抵达的油即可,在当前加油站加满油,开到找到的加油站;
4)找到的加油站价格比当前低,加足够到达找到的加油站的油即可;
5)如果没找到,那就判断当前加油站能否到达目的地,能就到达目的地,不能就输出最大距离;
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 500 + 5;
int n;
double c, dist, davg;
struct station
{
double dist;
double price;
bool operator < (const station& rhs) const
{
return dist < rhs.dist;
}
} sta[maxn];
void solve()
{
double maxDrive = c * davg;
int pos = 0, flag = 0;//flag 标记能否到达
double cost = 0, d = 0, remain = 0;// remain表示剩余油量
for(;;)
{
if(sta[0].dist != 0) break; //第一个加油站无法抵达
int u = -1;
double price = 1e20;
for(int i = pos + 1; i < n && sta[i].dist <= sta[pos].dist + maxDrive; i++)
{//寻找后面价格最低的加油站
if(price > sta[i].price)
{
price = sta[i].price;
u = i;
}
if(price < sta[pos].price) break; //已经比当前低了,退出查找
}
if(u == -1) //没有找到合适的加油站
{
if(d + maxDrive >= dist) //可到达目的地
{
flag = 1;
cost += ((dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
}
d += c * davg;
break;
}
if(sta[u].price > sta[pos].price) //找到的油价高于当前
{
if(d + maxDrive >= dist) //能抵达
{
flag = 1;
cost += ((dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
break;
}
else //不能抵达, 把油加满并减去开到找到的加油站的油
{
d = sta[u].dist;
cost += (c - remain)*sta[pos].price;
remain = c - (sta[u].dist - sta[pos].dist)/davg;
pos = u;
}
}
else //低于当前油价,直接开往找到的加油站
{
d = sta[u].dist;
cost += ((sta[u].dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
pos = u;
}
}
if(flag) printf("%.2f\n", cost);
else printf("The maximum travel distance = %.2f\n", d);
}
int main
4000
()
{
while(scanf("%lf%lf%lf%d", &c, &dist, &davg, &n) == 4)
{
for(int i = 0; i < n; i++)
{
double d, p;
scanf("%lf%lf", &p, &d);
sta[i].dist = d;
sta[i].price = p;
}
sort(sta, sta+n);
solve();
}
return 0;
}
解题思路:
贪心法。每在一个站都有如下情况:
1)刚出发时,第一个加油站不在0点,直接退出;
2)从当前加油站的后一个加油站在行驶距离内开始向前搜索,比较价格,直到找到价格比当前低的第一个加油站或者后续加油站中最便宜的;
3)找到的加油站价格比当前高,先检查能否直接到达目的地, 若能,加足够抵达的油即可,在当前加油站加满油,开到找到的加油站;
4)找到的加油站价格比当前低,加足够到达找到的加油站的油即可;
5)如果没找到,那就判断当前加油站能否到达目的地,能就到达目的地,不能就输出最大距离;
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 500 + 5;
int n;
double c, dist, davg;
struct station
{
double dist;
double price;
bool operator < (const station& rhs) const
{
return dist < rhs.dist;
}
} sta[maxn];
void solve()
{
double maxDrive = c * davg;
int pos = 0, flag = 0;//flag 标记能否到达
double cost = 0, d = 0, remain = 0;// remain表示剩余油量
for(;;)
{
if(sta[0].dist != 0) break; //第一个加油站无法抵达
int u = -1;
double price = 1e20;
for(int i = pos + 1; i < n && sta[i].dist <= sta[pos].dist + maxDrive; i++)
{//寻找后面价格最低的加油站
if(price > sta[i].price)
{
price = sta[i].price;
u = i;
}
if(price < sta[pos].price) break; //已经比当前低了,退出查找
}
if(u == -1) //没有找到合适的加油站
{
if(d + maxDrive >= dist) //可到达目的地
{
flag = 1;
cost += ((dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
}
d += c * davg;
break;
}
if(sta[u].price > sta[pos].price) //找到的油价高于当前
{
if(d + maxDrive >= dist) //能抵达
{
flag = 1;
cost += ((dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
break;
}
else //不能抵达, 把油加满并减去开到找到的加油站的油
{
d = sta[u].dist;
cost += (c - remain)*sta[pos].price;
remain = c - (sta[u].dist - sta[pos].dist)/davg;
pos = u;
}
}
else //低于当前油价,直接开往找到的加油站
{
d = sta[u].dist;
cost += ((sta[u].dist - sta[pos].dist)/davg - remain) * sta[pos].price;
remain = 0;
pos = u;
}
}
if(flag) printf("%.2f\n", cost);
else printf("The maximum travel distance = %.2f\n", d);
}
int main
4000
()
{
while(scanf("%lf%lf%lf%d", &c, &dist, &davg, &n) == 4)
{
for(int i = 0; i < n; i++)
{
double d, p;
scanf("%lf%lf", &p, &d);
sta[i].dist = d;
sta[i].price = p;
}
sort(sta, sta+n);
solve();
}
return 0;
}
相关文章推荐
- PAT (Advanced Level) Practise 1002 A+B for Polynomials (25)
- PAT (Advanced Level) Practise 1101 Quick Sort (25)
- PAT (Advanced Level) Practise 1002 A+B for Polynomials (25)
- 【PAT】【Advanced Level】1028. List Sorting (25)
- PAT (Advanced Level) Practise 1028 List Sorting (25)
- PAT (Advanced) 1025. PAT Ranking (25)
- PAT (Advanced) 1083. List Grades (25)
- PAT (Advanced Level) Practise 1078 Hashing (25)
- PAT (Advanced Level) Practise 1093 Count PAT's (25)
- PAT (Advanced Level) Practise 1114 Family Property (25)
- 1003. Emergency (25)——PAT (Advanced Level) Practise
- 1009. Product of Polynomials (25)——PAT (Advanced Level) Practise
- 1012. The Best Rank (25)——PAT (Advanced Level) Practise
- PAT (Advanced Level) 1007. Maximum Subsequence Sum (25)
- 【PAT】【Advanced Level】1079. Total Sales of Supply Chain (25)
- PAT (Advanced Level) 1051. Pop Sequence (25)
- PAT (Advanced Level) Practise 1003. Emergency (25) Dijstra扩展应用
- PAT (Advanced Level) 1021. Deepest Root (25) 并查集+DFS
- PAT (Advanced Level) 1059. Prime Factors (25)
- PAT (Advanced Level) 1085. Perfect Sequence (25) 贪心算法