刷题——hdu 6168 Numbers
/*
将ab数组放入map中记录,将ab数组排序
ab[0],ab[1]一定是a1,a2(毫无疑问的)
接下去不知道是a1+a2,还是a3,在map中将a1+a2去掉1
ab序列在map中查找,头一个数若个数不为0就是a3(a1,a2,a1+a2)已去掉1
同理将a1+a3,a2+a3去掉后头一个个数不为0的数就是a3
依次操作,就求出a数组
*/
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map>
using namespace std;
int ab[125300];
int a[125300];
int n,m,l;
int main(){
while(~scanf("%d",&m)){
n=(int)sqrt(m*2*1.0);
map<int,int>s;
for(int i=0;i<m;i++){
scanf("%d",&ab[i]);
s[ab[i]]++;
}
sort(ab,ab+m);//不排序也A了
l=0;
for(int i=0;i<m;i++){
if(s[ab[i]]>0){
for(int j=0;j<l;j++){
s[ab[i]+a[j]]--;
}
a[l++]=ab[i];
s[ab[i]]--;
if(l==n)break;
}
}
printf("%d\n",n);
for(int i=0;i<n;i++){
if(i)printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
将ab数组放入map中记录,将ab数组排序
ab[0],ab[1]一定是a1,a2(毫无疑问的)
接下去不知道是a1+a2,还是a3,在map中将a1+a2去掉1
ab序列在map中查找,头一个数若个数不为0就是a3(a1,a2,a1+a2)已去掉1
同理将a1+a3,a2+a3去掉后头一个个数不为0的数就是a3
依次操作,就求出a数组
*/
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map>
using namespace std;
int ab[125300];
int a[125300];
int n,m,l;
int main(){
while(~scanf("%d",&m)){
n=(int)sqrt(m*2*1.0);
map<int,int>s;
for(int i=0;i<m;i++){
scanf("%d",&ab[i]);
s[ab[i]]++;
}
sort(ab,ab+m);//不排序也A了
l=0;
for(int i=0;i<m;i++){
if(s[ab[i]]>0){
for(int j=0;j<l;j++){
s[ab[i]+a[j]]--;
}
a[l++]=ab[i];
s[ab[i]]--;
if(l==n)break;
}
}
printf("%d\n",n);
for(int i=0;i<n;i++){
if(i)printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.