题目:http://www.gdfzoj.com/oj/contest/466/problems/1
题目背景:保送后的你由于不屑校园生活,所以高三的你决定宅在家里,有一天刚出去买完泡面和薯片的你站在小卖部门口,突然眼前一黑,再次睁开眼睛时,发现自己站在了一个陌生的小镇里,建筑是中世纪的风格,但是路上的“生物”就不一般了,他们的头发以金色红色咖啡色为大宗,甚至连绿色蓝色都有,穿着方面有人套着铠甲,有人披着像舞娘的服装,还有人全身罩着黑色袍子,夸张的可以,在短暂的惊讶后,你不禁感叹这难道就是异世界召唤,此时眼前跑过一辆被巨大蜥蜴拉着跑的马车……
题目描述:在一个小巷中你遇到了三个小混混,本想试一试自己拥有了什么特殊能力的你被他们按在地上打,正当你快要绝望时,一个银发白衣少女救了你,为了报答他,你决定帮他找回丢失的徽章,苦苦追踪后,终于到了小偷所在的房子,但是门上奇怪的机关把你们挡在了外面.那个机关上面,有一个包含了N*N个数字的序列A。根据调查密码是一个N位的单调不升序列B,并且有提示:为了防止他人随便进入,A序列已经被打乱了顺序,看着一脸懵逼的少女,你决定要帮她解决这个问题。
这题目背景也是nb了
仔细推一推就能做出来了
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node
{
int tot,x;
};
const int maxS=1000;
int n;
int a[maxS*maxS+5],ans[maxS+5];
int A1[maxS+5],A2[maxS+5];
//A1记个数,A2记原数
int gcd(int x,int y)
{
if (x<y)
swap(x,y);
if (y==1)
return 1;
if (x%y==0)
return y;
gcd(y,x%y);
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,tmp=0,j,m,pos,temp;
freopen("a.txt","r",stdin);
scanf("%d",&n);
for (i=1;i<=n*n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n*n+1);
// for (i=1;i<=n*n;i++) printf("%d ",a[i]);
for (i=1;i<=n*n;i++)
if (a[i]!=a[i-1])
{
tmp++;
A1[tmp]=1;
A2[tmp]=a[i];
}
else
A1[tmp]++;
i=tmp; temp=0;
// printf("%d",lower_bound(a+1,a+17,6)-a);
while (i>=2)
{
if (A1[i]==0)
{
i--;
continue;
}
temp++;
A1[i]--; ans[temp]=A2[i];
for (j=1;j<temp;j++)
{
m=gcd(A2[i],ans[j]);
pos=lower_bound(A2+1,A2+tmp+1,m)-A2;
A1[pos]=A1[pos]-2;
}
}
for (i=1;i<=temp;i++)
printf("%d ",ans[i]);
return 0;
}