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;
}
比赛的时候,没有枚举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;
}
相关文章推荐
- 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)
- (2017多校训练第二场)HDU - 6047 Maximum Sequence 贪心 + 单调队列
- (2017多校训练第一场)HDU - 6034 Balala Power! 贪心
- 【多校训练】hdu 6168 Numbers
- 2017 多校训练第二场 HDU 6055 Regular polygon
- 2017 多校训练第五场 HDU 6085
- HDU 6134 && 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
- 2017 多校训练第四场 HDU 6069 Counting Divisors
- hdu 6168 Numbers(多校联赛)
- 多校第九场 1004 hdu 5399 Too Simple(贪心)
- 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon
- HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9
- 2017 多校训练第十场 HDU 6178 Monkeys 最小点覆盖+树形DP
- (2017多校训练第二场)HDU - 6053 TrickGCD 初见莫比乌斯
- HDU 2017 多校联合训练赛3 3003 6058 Kanade's sum 枚举 模拟链表
- (2017多校训练第三场)HDU - 6058 Kanade's sum 链表
- (2017多校训练第七场)HDU - 6129 Just do it 找规律
- (2017多校训练第七场)HDU - 6129 Just do it
- HDU 4864Task(多校联合训练1)(贪心)
- 2017 多校训练第一场 HDU 6038 Function