1. 程式人生 > 實用技巧 >codeforces 1250B The Feast and the Bus

codeforces 1250B The Feast and the Bus

題意:
有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;
}