• 洛谷 1016 旅行家的预算


    A掉此题后我翻了几篇洛谷上的题解,发现大家的题解思路都比较高级,代码普遍特长,于是来写篇题解。

    做法:贪心+模拟

    大家似乎都是这个思路啊,没错,但我的思路应该算是最为简单的之一。

    首先以油价位第一关键字,位置先后为第二关键字排序,然后从头到尾扫一遍,能加多少油就加多少油。

    注意可以将起点终点当作中间站加入进去,以降低代码量。

    AC代码:

    #include <algorithm>
    #include <cstdio>
    
    double D, c, dis, cd, pri, d[12], p[12], go[12], ans = 0;
    int n;
    
    struct node
    {
        double d, p;
        int num;
        bool operator < (const node & b) const
        { if (p == b.p) return num < b.num; return p < b.p; }
    }sta[12];
    
    signed main()
    {
        scanf("%lf%lf%lf%lf%d", &D, &c, &dis, &pri, &n);
        for (int i = 1; i <= n; ++i)
        {
            scanf("%lf%lf", &d[i], &sta[i].p);
            p[i] = sta[i].p;
            sta[i].num = i;
        }
        sta[n + 1].p = 99999, sta[n + 1].num = n + 1, d[n + 1] = D, p[n + 1] = 99999;
        sta[n + 2].p = pri, sta[n + 2].num = 0, d[0] = 0, p[0] = pri;
        std::sort(sta + 1, sta + n + 3);
        for (int i = 1; i <= n + 1; ++i)
        {
            int u = sta[i].num;
            double res = c - (go[u] / dis);
            for (int j = u + 1; j <= n + 1; ++j)
            {
                if (res <= 0) break;
                if (go[j - 1] == d[j] - d[j - 1]) continue;
                cd = (d[j] - d[j - 1] - go[j - 1]) / dis;
                if (res >= cd) res -= cd, go[j - 1] = d[j] - d[j - 1], ans += p[u] * cd;
                else go[j - 1] = res * dis, ans += p[u] * res, res = 0;
            }
        }
        for (int i = 0; i <= n; ++i)
            if (go[i] != d[i + 1] - d[i])
            {
                puts("No Solution");
                return 0;
            }
        printf("%.2lf", ans);
        return 0;
    }
  • 相关阅读:
    辅助工具链接
    参考资料链接
    oracle sql 查询前十条数据
    oracle sql 按照汉字规则排序
    oracle sql 修改timestamp数据
    eclipse闪退
    js 数组Array
    面试题:树的子结构
    面试题:二叉树中和为某一路径
    面试题:二叉搜索树的后序遍历
  • 原文地址:https://www.cnblogs.com/yanyiming10243247/p/9874175.html
Copyright © 2020-2023  润新知