【luoguP1414]】又是毕业季II

题目链接

\(solution\)

暴力求每个数有多少个倍数,从大到小,数\(i\)的倍数有\(f_i\)个,那么选\(1\)~\(f_i\)个同学的答案可以为\(i\),取第一次更新的答案最大

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int MAXN=1000010;

int n,a[MAXN],f[MAXN],ans[MAXN];
int Max=0;

int main()
{
	scanf("%d",&n);
	int x;
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		++a[x];
		Max=max(Max,x);
	}
	for(int i=Max;i>=1;--i)
		for(int j=i;j<=Max;j+=i)
			f[i]+=a[j];
	int r=0;
	for(int i=Max;i>=1&&r<=n;--i)
	  if(f[i])
		while(r+1<=f[i]) ans[++r]=i;
	for(int i=1;i<=n;++i)
		printf("%d\n",ans[i]);
	return 0;
}
posted @ 2019-10-21 11:25  yjk  阅读(89)  评论(0编辑  收藏  举报