题意:
有N个人 K个队伍 然后跟N个数 ai表示第i个人的队伍编号 现在要找一辆车 这个车的容量可以自己定 但是这个车最多只能装两个队伍并且必须把同一个队伍的人全部装上 然后车的花费是选定的容量S和装的此时R的乘机 即S*R 问这个乘积的最小值
思路:
因为一辆车最多只能装2个队伍 所以我们设l=1 r=k 每次尽可能的把l,r放在一起带走 这样可以保证得到的S是最小的 然后我们再遍历a[1]——S的最大值 在遍历的过程中再不断的把l,r凑到一起就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int v,a[8005];
int main()
{
int n,m;
cin>>n>>m;-
for(int i=1;i<=n;i++)
{
cin>>v;
a[v]++;
}
sort(a+1,a+1+m,greater<int>());
int maxx = 0;
for(int i=1,j=m;i<=j;i++,j--)
{
if(i!=j)
{
maxx = max(maxx , a[i]+a[j]);
}
else maxx = max(maxx , a[i]);
}
ll ans = 1e16;
for(int i = a[1] ;i <= maxx ;i++)
{
int l = 1,r = m;
int times = 0;
while(l<=r)
{
times++;
if(l != r && a[l]+a[r]<=i)
{
l++,r--;
}
else l++;
}
ans = min(ans,times*i*1ll);
}
cout<<ans<<endl;
return 0;
}