洛谷P1016 [NOIP1999 提高组] 旅行家的预算

bug:不小心用int去存了一个double的数据结果死活过不了

#include <bits/stdc++.h>
using namespace std;
// typedef long long ll;
inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
        x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
    return x * f;
}

int n;
double res, d1, c, d2, p, sum, len, a[10][2];
int f(int now) {
    int low = 0;  //可到达的最低价格油站
    double low_p = 1000;
    for (int i = now + 1; i <= n; ++i) {
        //判断能不能去
        if ((a[i][0] - a[now][0]) <= len) {
            //价格低,所以要去
            if (a[i][1] < a[now][1]) {
                //花费的钱
                sum += (a[i][0] - a[now][0] - res) / d2 * a[now][1];
                res = 0;
                return i;
            }
            //记录第二选择站点
            else if (a[i][1] < low_p) {
                low = i;
                low_p = a[i][1];
            }
        } else {
            break;
        }
    }

    //判断是否一定要走到终点还是走第二站点
    if ((d1 - a[now][0]) <= len) {
        //可以走终点
        //花费的钱
        sum += (d1 - a[now][0] - res) / d2 * a[now][1];

        return 0;
    }
    //无法走到终点,只能走第二站点
    else if (low != 0) {
        //到第二站点剩余油能跑多远
        res = len - (a[low][0] - a[now][0]);
        //花费的钱
        sum += c * a[now][1];
        return low;
    } else {
        //无法走到任何下一个站点
        return -1;
    }
}
int main() {
    cin >> d1 >> c >> d2 >> p >> n;
    a[0][0] = 0, a[0][1] = p;  // 0是距离,1是油价
    for (int i = 1; i <= n; ++i) {
        cin >> a[i][0] >> a[i][1];
    }
    len = d2 * c;
    int k = 0;
    while (1) {
        k = f(k);
        if (k == 0) {
            printf("%.2lf", sum);
            break;
        } else if (k == -1) {
            cout << "No Solution" << endl;
            break;
        }
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值