刷題——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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.