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

来源:互联网 发布:sql安装进度条不动 编辑:程序博客网 时间:2024/05/16 15:18

陷阱:没有距离为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;}
0 0