题目链接:
题意:给定n个数所属集合,每次运输可以最多2个集合,同一集合必须一起运输;运输空间大小为s,运输次数为res,需要代价为s*res,现设计一个方案求最小代价。n<=2e5,集合数k<=8000。
题解:直接枚举,双指针贪心取数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
const int maxn=500010;
int n,k;
int a[maxn];
int main(){
scanf("%d%d",&n,&k);
int x;
for(int i=1;i<=k;i++) a[i]=0;
for(int i=1;i<=n;i++){
scanf("%d",&x);
a[x]++;
}
sort(a+1,a+k+1);
int mn=a[k],mx=a[k]+a[k-1];
ll ans=inf;
for(int s=mn;s<=mx;s++){
int l=1,r=k;
int res=0;
while(l<=r){
if((l<r)&&a[l]+a[r]<=s){
l++;r--;
}else{
r--;
}
res++;
}
// printf("res:%d s:%d\n",res,s);
ans=min(ans,1LL*res*s);
}
printf("%I64d\n",ans);
return 0;
}