zoukankan      html  css  js  c++  java
  • [CF1250B] The Feast and the Bus

    Description

    公司有 $ n $ 名员工和 $ k $ 个团队,每个员工仅属于 $ 1 $ 个团队,每个团队至少有 $ 1 $ 名员工。团队编号从 $ 1 $ 到 $ k $。

    给出 $ n $ 个数字:$ t_1,t_2,dots,t_n (,) t_i $ 表示第 $ i $ 个员工属于第 $ t_i $ 个团队。

    该公司雇佣了一辆班车,这辆班车将会往返多次承载员工去参加宴会,每一次可以承载 $ 1 $ 个团队或者 $ 2 $ 个团队,且每一个团队不能分离,必须在同一次车上。

    这辆车可以承载 $ s $ 个员工,$ s $ 可以为任意值。

    假设通过 $ r $ 次运输,所有的员工都到达宴会目的地了,该公司需要支付 $ sr $ 元(只有 $ 1 $ 辆班车)。现在要你计算 $ rs $ 的最小值。
    $ 1le n le 5 imes 10^5,1 le k le 8000 $

    Solution

    题目只要求 (O(k^2)) 做法,于是我们枚举 (s),然后暴力贪心检验即可

    注意枚举的 (s) 的取值,假设 (a) 有序,那么 (s in { a_1+a_k,a_2+a_{k-1},dots })

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    int n,k,t[N],a[N],ans=1e18;
    
    void check(int s) {
        int r=0;
        if(s<a[k]) return;
        int j=1;
        for(int i=k;i>=j;--i) {
            if(j<i) {
                if(a[i]+a[j]<=s) ++j;
                ++r;
            }
            else {
                ++r;
            }
        }
        ans=min(ans,r*s);
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>t[i], a[t[i]]++;
        sort(a+1,a+k+1);
        for(int i=1;i<=k/2;i++) {
            check(a[i]+a[n-i+1]);
        }
        check(a[k]);
        cout<<ans<<endl;
    }
    
  • 相关阅读:
    Android Studio AVD和SDK Manager灰色不能点击的问题。
    回溯:最佳调度问题
    回溯:八皇后问题(蒟蒻)
    usaco1.4.3等差数列
    单调队列练习题(oj p1157 p1158 p1159)
    OJP1147括号匹配加强版(栈)与P1153乱头发节(单调栈)
    NOIP2017游记......
    火柴棒等式c++
    潜伏者(noip09年t1)解题报告 C++
    2016noipday1t1玩具迷题结题报告
  • 原文地址:https://www.cnblogs.com/mollnn/p/12822160.html
Copyright © 2011-2022 走看看