您的位置:首页 > 其它

2017 多校训练第九场 HDU 6168 Numbers 贪心枚举

2017-08-22 22:48 591 查看
因为a数组都是正数,那么根据定义:混合之后的数组中最小的两个数必然是在a数组的,因此先选取这两个数,然后贪心枚举。

比赛的时候,没有枚举b数组的数,因此map就自动生成了许多数,造成MLE。

现在重写一遍倒是想明白了。

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int maxn=150000;

int num[maxn],a[maxn];

void inint(){
memset(num,0,sizeof(num));
for(int i=1;i<=500;i++){
int m=i*(i+1)/2;
num[m]=i;
}
}
map<int,int>mii;

int main(int argc, char const *argv[])
{
inint();
int m;
while(~scanf("%d",&m)){
vector<int>a(m);
mii.clear();
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
mii[a[i]]++;
}
if(m==0){
printf("0\n\n");
continue;
}
int n=num[m];
sort(a.begin(),a.end());
vector<int>ans;
ans.push_back(a[0]),ans.push_back(a[1]);
mii[a[0]]--,mii[a[1]]--;
mii[a[0]+a[1]]--;
int x=a[0];
int k=0;
for(k=0;k<m;k++){
x=a[k];
if(mii[x]) break;
}
for(int i=2;i<n;i++){
ans.push_back(x);
for(int j=0;j<(int)ans.size()-1;j++){
mii[x+ans[j]]--;
}
mii[x]--;
for(;k<m;k++){
x=a[k];
if(mii[x]) break;
}
}
printf("%d\n",n);
for(int i=0;i<n;i++){
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: