标签:names ast c++ des main for name 个数 end
公司有 $ 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 $ 的最小值。
$ 1\le n \le 5\times 10^5,1 \le k \le 8000 $
题目只要求 \(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;
}
[CF1250B] The Feast and the Bus - 贪心
标签:names ast c++ des main for name 个数 end
原文地址:https://www.cnblogs.com/mollnn/p/12822160.html