1. 程式人生 > 其它 >P4447 [AHOI2018初中組]分組

P4447 [AHOI2018初中組]分組

排序後掃一遍,維護當前分組方案,儘量加入人數少的組。如果某些組再也不可能加入了就統計最小值,如果每組都加入過了相同的實力值就新開一組。

因為組的資訊具有單調性,所以可以用雙端佇列 \(O(n)\) 維護。

code:

#include<bits/stdc++.h>
using namespace std;
#define Min(x,y)((x)<(y)?x:y)
#define For(i,x,y)for(i=x;i<=(y);i++)
int a[100005];
deque<pair<int,int> >deq;
int main()
{
	int n,i,mn;
	scanf("%d",&n);
	mn=n;
	For(i,1,n)scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	For(i,1,n)
	{
		if(deq.empty())
		{
			deq.push_back(make_pair(a[i],1));
			continue;
		}
		while(!deq.empty())
		if(deq.front().first+1<a[i])mn=Min(mn,deq.front().second),deq.pop_front();
		else break;
		if(deq.empty()||deq.front().first==a[i])
		{
			deq.push_front(make_pair(a[i],1));
			continue;
		}
		deq.push_back(make_pair(deq.front().first+1,deq.front().second+1));
		deq.pop_front();
	}
	while(!deq.empty())mn=Min(mn,deq.front().second),deq.pop_front();
	printf("%d",mn);
	return 0;
}