您的位置:首页 > 其它

【PAT甲级】1033. To Fill or Not to Fill (25)

2016-10-21 18:15 281 查看
陷阱:没有距离为0加油站,则汽车无法行驶( ´◔ ‸◔’)

#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct Sta {
double price;
double dist;
double gas_ds;
} Sta;
double c_max;
double d;
double d_avg;
int n;
double full_dist;//加满后可以行驶的距离
double run_dist;//已经行驶的距离
Sta s[501];
bool com(Sta a, Sta b) {
return a.dist < b.dist;
}
int findnext(int a, int b);

int main(int argc, char *argv[]) {
scanf("%lf %lf %lf %d", &c_max, &d, &d_avg, &n);
int i, j, k;
int flag = 1;
for (i = 0; i < n; i++) {
scanf("%lf %lf", &s[i].price, &s[i].dist);
s[i].gas_ds = 0;
flag = flag * s[i].dist;
}
if (flag != 0.0) {
printf("The maximum travel distance = 0.00\n");
return 0;
}

n++;
s[n - 1].dist = d;
sort(s, s + n, com);

full_dist = c_max * d_avg;
run_dist = 0.0;
int lastmin = 0;
double lastpos = 0.0;
for (i = 0; i < n - 1; i++) {
if (s[i + 1].dist - s[i].dist > full_dist) {
run_dist = s[i].dist + full_dist;
break;
} else {
if (s[i].price < s[lastmin].price) {
s[lastmin].gas_ds = s[i].dist - lastpos;
lastmin = i;
lastpos = s[i].dist;
} else {
if (s[i + 1].dist - s[lastmin].dist <= full_dist) {
} else {
do {
s[lastmin].gas_ds = s[lastmin].dist + full_dist - lastpos;
lastpos = s[lastmin].dist + full_dist;
lastmin = findnext(lastmin + 1, i);
} while (s[i + 1].dist - s[lastmin].dist > full_dist);
}
}
}
}
s[lastmin].gas_ds = s[n - 1].dist - lastpos;
if (run_dist > 0.0) {
printf("The maximum travel distance = %.2f\n", run_dist);
} else {
double sum = 0.0;
for (i = 0; i < n - 1; i++) {
if (s[i].gas_ds > 0) {
sum += s[i].gas_ds * s[i].price;
}
}
sum = sum / d_avg;
printf("%.2lf\n", sum);
}
return 0;
}
int findnext(int a, int b) {
if (a > b) return -1;
int minIndex = a;
for (int i = a; i <= b; i++) {
if (s[i].price < s[minIndex].price) {
minIndex = i;
}
}
return minIndex;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: