您的位置:首页 > 其它

hdu 6168 模拟+优先队列

2017-08-23 10:46 441 查看
zk has n numbers a1,a2,...,an.
For each (i,j) satisfying 1≤i<j≤n, zk generates a new number (ai+aj).
These new numbers could make up a new sequence b1,b2,...,bn(n−1)/2.

LsF wants to make some trouble. While zk is sleeping, Lsf mixed up sequence a and b with random order so that zk can't figure out which numbers were in a or b. "I'm angry!", says zk.

Can you help zk find out which n numbers were originally in a?

 

Input

Multiple test cases(not exceed 10).

For each test case:
∙The
first line is an integer m(0≤m≤125250), indicating the total length of a and b. It's guaranteed m can be formed as n(n+1)/2.
∙The
second line contains m numbers, indicating the mixed sequence of a and b.

Each ai is
in [1,10^9]

 

Output

For each test case, output two lines.

The first line is an integer n, indicating the length of sequence a;

The second line should contain n space-seprated integers a1,a2,...,an(a1≤a2≤...≤an).
These are numbers in sequence a.

It's guaranteed that there is only one solution for each case.

 

Sample Input

6
2 2 2 4 4 4
21
1 2 3 3 4 4 5 5 5 6 6 6 7 7 7 8 8 9 9 10 11

 

Sample Output

3
2 2 2
6
1 2 3 4 5 6

 

Source

2017 Multi-University Training Contest - Team 9

 

Recommend

liuyiding   |   We have carefully selected several similar problems for you:  6170 6169 6168 6167 6166 

首先最小的两个一定是a数组里边的然后把a【0】+a【1】加入到b数组(优先队列)中,在找下一个如果等于b数组中的数就继续,如果不等于b数组里的数就是a数组里的数,更新b数组就可以了

ac代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
int a[125255];
int c[200001];
int b[200001];
int main()
{
int m;
while(cin>>m)
{
priority_queue<int,vector<int>,greater<int> >q1;
while(!q1.empty())
q1.pop();
for(int i=0; i<m; i++)
scanf("%d",&c[i]);
sort(c,c+m);
if(m==0)
{
printf("0\n");
printf("\n");
}
else if(m==1)
{
printf("1\n");
printf("%d\n",c[0]);
}else{
int lena=0;
int k=0;
int n=sqrt(2*m);
a[lena++]=c[0];
a[lena++]=c[1];
int ph=c[0]+c[1];
q1.push(ph);
for(int i=2; i<m; i++)
{
if(!q1.empty()&&c[i]==q1.top())
{
q1.pop();
continue;
}
else
{
a[lena++]=c[i];
for(int j=0; j<lena-1; j++)
{q1.push(a[lena-1]+a[j]);
//cout<<a[lena-1]+a[j]<<endl;
}
}
if(lena==n)
break;
}
printf("%d\n",n);
for(int i=0; i<lena-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[lena-1]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: