• ZOJ 3699 Dakar Rally(贪心)


      这是一道贪心题,他的贪心思想很容易想明白,我们保证油箱里的油始终是最便宜的我们最后的花费就能是最少的.实现方法就是:比如现在在i点,我们看邮箱满载能最远到达哪里,不妨设最远到达j,(j >= i + 1),注意此处的达到,只是指能够到达这个路段的开头位置,并不是走完这段路...所以我们到达j点会有一个leave剩余,leave >= 0,但是在i 和 j点之间我们只需要到达第一个油价比i点小的路段开头位置,换上新油就可以了,之所以是第一个,是因为题目要求必须从前往后按顺序走,不妨设中间有没有出现这样的加油站这个命题为flag,若找到flag为true,没找到flag为false.

      下面开始讨论,如果flag = true,则我们可以不需要加满油,只需要到达油价低的点就可以了

      如果flag = false,就会出现两种情况,如果j < n,即未能走完第n个点,我们需要加满油,但是j >= n点时,我们可以不用加满油,既然贪心就是最优,不能走完了以后还有剩下的油.

      这个题实话说我错了好多次,hustvj都快被我刷屏了,可能是因为循环不太好控制,我一开始用的for,后来换了while,又看了别人的写法,才纠正过来.正如到油价最低点那段代码,其实可以直接过去,但我还是选择了i++的形式,花样作死玩怕了...还是稳重AC吧.

      另外除了直接循环的方式,还可以用单调队列,某些高端玩家用的这种方法,感兴趣的百度一下吧.

      还有,最后结果用long long,int会爆WA.代码如下:(不要吐槽风格太像,我也不想,改了很多次结果改的跟人家差不多了)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define maxn 100010
    int len[maxn],unit[maxn],price[maxn];
    int main()
    {
        int t,n,all;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&all);
            bool flag = true;
            for(int i = 0; i < n; i++)
            {
                scanf("%d%d%d",&len[i],&unit[i],&price[i]);
                if(len[i] * unit[i] > all)
                {
                    flag = false;
                }
            }
            if(!flag)
            {
                puts("Impossible");
                continue;
            }
            long long leave = 0,ans = 0,need = 0,i = 0,j;
            while(i < n)
            {
                j = i + 1;
                need = len[i] * unit[i];
                while(j < n && price[j]>=price[i] && all - need >= unit[j] * len[j])
                {
                    need += len[j] * unit[j];
                    ++j;
                }
    
                if(j < n && price[j] >= price[i])///这步讨论别忘了,没有找到也不需要加满的一种情况
                {
                    ans += (all - leave) * price[i];
                    leave = all - len[i] * unit[i];
                    i++;
                }
                else
                {
                    if(leave > need) leave -= need;
                    else
                    {
                        ans += (need - leave) * price[i];
                        leave = 0;
                    }
                    i = j;
                }
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
    洛谷P1002 过河卒 题解 动态规划
    python 查看数据类型
    python 输出小技巧
    python 基础定义变量
    python 关键字
    flask restful 反查询
    Please edit configuration/connection/logging settings in '/home/mac126/Desktop/13/test3-1/migrations/alembic.ini' before proceeding.
    KeyError: 'migrate'错误解决办法
    flask 的简单拆分升级版2
  • 原文地址:https://www.cnblogs.com/jifahu/p/5497726.html
Copyright © 2020-2023  润新知