#1, #2 WA 优先队列求调 玄关
查看原帖
#1, #2 WA 优先队列求调 玄关
755503
LiJinLin_AFO楼主2024/2/23 22:38
#include<stdio.h>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
int lnk[100005],knl[100005],ans=2147483647;
map<int,bool> mp;
map<int,int> mps;
struct r{
	int num,val;
	r(int x=0,int y=0){val=x,num=y;}
	inline bool operator<(const r &x) const{
		return val>x.val;
	}
}a[100005],link,f[100005];
priority_queue<r> q;
int main(){
	int n,num=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&lnk[i]);
	for(int i=1;i<=n;i++){
		if(!mp[lnk[i]]) mp[lnk[i]]=true,knl[++num]=lnk[i];
		mps[lnk[i]]++;
	}
	for(int i=1;i<=num;i++) q.push(r(knl[i],mps[knl[i]]));
	while(q.size()){
		int ns=0;
		link=q.top();q.pop();
		f[++ns]=link;
		while(q.size()&&link.val+1==q.top().val){
			link=q.top();q.pop();
			f[++ns]=link;
		}
		int min_num=a[1].num;
		for(int i=2;i<=ns;i++) min_num=min(min_num,a[i].num);q.push(r(f[i].val,f[i].num-min_num));
		while(q.size()&&q.top().num==0) q.pop();
		ans=min(ans,ns);
	}
	printf("%d",ans);
	return 0;
}
2024/2/23 22:38
加载中...