codeforces732E Sockets(数据结构+贪心+思维)

版权声明:本文为博主原创文章,欢迎转载。 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;
}

##总结
满足两个条件的最优,可以在保证某个条件成立的前提下,取另一个条件的最优。

猜你喜欢

转载自blog.csdn.net/define_danmu_primer/article/details/53117240
今日推荐