洛谷地址:https://www.luogu.com.cn/problem/CF1250B
题意:
n个人,k个队伍,每个人属于队伍ai,汽车一次至多载两只队伍(全员),费用为车的容量*载人次数,问最少花费。
解析:
对k个组的人数进行从小到大的排序。
那么车容量至少为ak,才能保证按条件运送所有队伍。
假设一个大组上了车,就贪心地上一个小组。因为每次最多运两个组,这样是省容量的最优方法。
枚举容量,ak~maxx(最大的ai+ak-i+1和)
定义l=1,r=k,如果可以被装走,l++,r--,否则,就让大组优先上
如果末尾l==r了,说明还有一个组没有上车,cnt++即可。
#include<bits/stdc++.h> #include<iostream> #include<cstring> #include<string.h> #include<cmath> #include<map> using namespace std; typedef long long ll; const int maxn=8e3+10; ll a[maxn]; int main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { int x; cin>>x; a[x]++; } sort(a+1,a+1+k); ll maxx=0; for(int i=1;i<=k;i++) { maxx=max(maxx,a[i]+a[k-i+1]); } ll minn=1e16; for(ll i=a[k];i<=maxx;i++) {int cnt=0; ll l=1,r=k; while(l<r) { cnt++; if(a[l]+a[r]<=i) { l++; r--; } else r--; } if(l==r) cnt++; minn=min(minn,i*cnt); } cout<<minn<<endl; }