版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/define_danmu_primer/article/details/53117240
##题意
##思路
先比较有无相同的,有则匹配,然后对s序列除2向上取整,再比较,一直循环,循环31次。我用的multimap。
##代码
/* ********************************
Author : danmu
Created Time : 2016年11月10日 星期四 12时11分27秒
File Name : a.cpp
******************************** */
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define rep(i,x,y) for(int i=x;i<=y;++i)
#define _rep(i,x,y) for(int i=x;i>=y;--i)
#define CL(S,x) memset(S,x,sizeof(S))
#define CP (S1,S2) memcpy(S1,S2,sizeof(S2))
#define ALL(x,S) for(x=S.begin();x!=S.end();++x)
#define ULL unsigned long long
#define PI 3.1415926535
#define INF 0x3f3f3f3f
#define LL long long
const int maxn = 2e5;
const int mod = 1e9 + 7;
const double eps = 1e-8;
using namespace std;
int n,m,c,u;
int s[maxn+5];
multimap<int,int> p;
int ansa[maxn+5],ansb[maxn+5];
int main(){
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int tmp;
memset(ansa,-1,sizeof ansa);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
scanf("%d",&tmp);
p.insert(make_pair(tmp,i));
}
for(int i=1;i<=m;++i){
scanf("%d",s+i);
}
for(int i=0;i<=30;++i){
for(int j=1;j<=m;++j){
if(ansa[j]==-1){
multimap<int,int>::iterator it=p.find(s[j]);
if(it!=p.end()){
ansa[j]=i;
ansb[it->second]=j;
++c;
u+=i;
p.erase(it);
}
}
}
for(int j=1;j<=m;++j)
s[j]=s[j]/2+(s[j]&1?1:0);
}
printf("%d %d\n",c,u);
for(int i=1;i<=m;++i){
printf("%d%c",ansa[i]==-1?0:ansa[i],i==m?'\n':' ');
}
for(int i=1;i<=n;++i){
printf("%d%c",ansb[i],i==n?'\n':' ');
}
return 0;
}
##总结
满足两个条件的最优,可以在保证某个条件成立的前提下,取另一个条件的最优。