zoukankan      html  css  js  c++  java
  • 运输--模拟

    传送门

    我...手推样例都推不出来

    (怀疑样例可真傻

    救救孩子

    (蒟蒻莫得未来

    -------------------------------------------------------------------------------------------

    题目描述
    现在已知 N 件商品,和搬运它们其中每一件的费用。现在搬家公司老板 Mr.sb 决定让我们每次任意选取 2 件商品。然后这 2 件商品只算一件商品的费用。但是这个商品的搬运费用是将选出的 2 个商品的费用之和除以 k 的运算结果。如此反复。直到只收一件商品的钱。这个就是商店要付的费用。掌柜的想尽可能的少付钱,以便将更多的钱捐给希望工程。所以请你帮他计算一下最少只用付多少钱。


    输入
    n,k
    w1,w2,...,wn(每一件商品的搬运费用)
    n,k<=10000

    输出
    最少付多少钱


    样例输入

    5 2

    1 2 3 4 5

    样例输出

    1

    --------------------------------------------------------------------------------------

    贪心:

    每次取最大值和次大值合并就好了

    (据说特别想合并果子orz

    要想合并后的答案放回原序列

    再重新去取最大值和次大值排序

    反复

    直到合并到只剩下了一个值

    就是最优费用了

    显然每次排序复杂度实在是太不友好le

    所以优先队列prioity_queue

    #include<cstdio>
    #include<queue>
    using namespace std;
    
    inline int read()
    {
        int sum = 0,p = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-')
                p = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            (sum *= 10) += ch - '0';
            ch = getchar();
        }
        return p * sum;
    }
    
    
    priority_queue<int>q;
    int n,k;
    int main()
    {
        n = read(),k = read();
        for(int i = 1;i <= n;i++)
        {
            int a = read();
            q.push(a);
        }
        while(q.size() != 1)
        {
            int a = q.top();
            q.pop();
            int b = q.top();
            q.pop();
            int c = (a + b)/k;
            q.push(c);
        }
        printf("%d",q.top());
        return 0;
    }
  • 相关阅读:
    EL+Serilog日志
    HttpClientFactory-向外请求的最佳
    Autofac依赖注入
    .Net Core MemoryCache
    时间复杂度和空间复杂度
    中间件-异常处理
    依赖注入-1
    使用并发集合
    安卓刷机&root
    Mac Android Studio 常用快捷键大全
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10890491.html
Copyright © 2011-2022 走看看