• 976 AlvinZH想回家(背包DP大作战T)


    976 AlvinZH想回家

    思路

    如果在第i小时有一些飞机延误,那么一架飞机的c值越大,这一小时产生的损失也越大。而使这一小时产生的损失尽可能的小并不会导致接下来时间产生的损失增大。因此应当每一小时都找出要飞的飞机中c值最大的飞走,即贪心思想

    题目有要求,第k+i小时,应该从1~k+i架航班中未飞出的航班中选出ci最大的飞走.

    由于需要将找出数据中的最大值、去掉数据中最大值,可以考虑使用优先队列

    贪心证明: 设序号为i的飞机起飞时间为di,则cost=∑(di-i)_ci=∑di_ci-∑i*ci. 显然后一项为常数,而d(i)为[k+1,k+n]的一个排列,所以只要使ci越大的i尽可能早起飞即可使得cost最小。

    可以输入完之后再处理,见参考代码一。一般输入一边处理,见参考代码二。思想相同,并无差别。

    参考代码一

    //
    // Created by AlvinZH on 2017/11/6.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    struct Flight
    {
        int c, id;
        bool operator<(const Flight& b) const {
            return c < b.c;
        }
    }F[500005], t;
    
    int n, k;
    long long ans;
    priority_queue<Flight> Q;
    
    int main()
    {
        while(~scanf("%d%d",&n,&k))
        {
            ans = 0;
            for(int i = 1; i <= n; i++)
            {
                scanf("%d", &F[i].c);
                F[i].id = i;
            }
            for(int i = 1; i <= k; i++)
                Q.push(F[i]);
            for(int i = k+1; i <= k+n; i++)
            {
                if(i <= n)
                    Q.push(F[i]);
                t = Q.top();
                Q.pop();
                ans += (long long)t.c * (i-t.id);
            }
            printf("%lld
    ", ans);
        }
    }
    

    参考代码二

    //
    // Created by AlvinZH on 2017/11/6.
    // Copyright (c) AlvinZH. All rights reserved.
    //
    
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    struct Flight
    {
        int c, id;
        Flight(int c, int id):c(c), id(id) {}
        bool operator < (const Flight& b) const {
            return c < b.c;
        }
    };
    
    int n, k, c;
    long long ans;
    Flight F(0,0);
    priority_queue<Flight> Q;
    
    int main()
    {
        while(~scanf("%d%d",&n,&k))
        {
            ans = 0;
            for(int i = 1; i <= n + k; i++)
            {
                if(i <= n)
                {
                    scanf("%d", &F.c);
                    F.id = i;
                    Q.push(F);
                }
                if(i >= k+1)//开始处理
                {
                    F = Q.top();
                    Q.pop();
                    ans += (long long)F.c * (i-F.id);
                }
            }
            printf("%lld
    ", ans);
        }
    }
    
  • 相关阅读:
    SpringBoot--整合Mybatis
    SpringBoot--使用JDBC连接mysql
    使用docker创建mysql容器
    iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name
    SpringBoot--配置文件
    yqq命令
    vim/vm命令后提示错误:Found a swap file by the name ".dockerfile.swp"
    推荐一个十分好看的开源博客系统
    [转]技术的热门度曲线
    逆向学习笔记(2)-这是代码还是数据
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/7867616.html
Copyright © 2020-2023  润新知