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

来源:互联网 发布:淘宝店铺模板有什么用 编辑:程序博客网 时间:2024/06/07 02:14

因为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;}


原创粉丝点击