1. 程式人生 > >【貪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company

【貪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company

nal head 1+n final ase algorithm erase 集合 clu

考慮兩個人,先把各自的集合排個序,丟掉一半,因為比較劣的那一半一定用不到。

然後貪心地放,只有兩種決策,要麽把一個最優的放在開頭,要麽把一個最劣的放在結尾。

如果我的最優的比對方所有的都劣(或等於),我就把我最劣的往結尾放。否則我把我最優的往開頭放。

用multiset維護兩人的集合即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
int n;
char s1[300010],s2[300010],s3[300010];
multiset<char>S1,S2;
multiset<char>::iterator it;
bool cmp(const char &a,const char &b){
	return a>b;
}
int main(){
//	freopen("c.in","r",stdin);
	scanf("%s%s",s1+1,s2+1);
	n=strlen(s1+1);
	sort(s1+1,s1+n+1);
	sort(s2+1,s2+n+1,cmp);
	for(int i=1;i<=n/2;++i){
		S1.insert(s1[i]);
		S2.insert(s2[i]);
	}
	if(n&1){
		S1.insert(s1[n/2+1]);
	}
	
	int head=1,tail=n;
	for(int i=1;i<=n;++i){
		if(i==n && (n&1)){
			s3[head++]=*S1.begin();
			break;
		}
		char x1=*S1.begin();
		it=S2.end(); --it;
		char x2=*it;
		if(i&1){
			if(x1<x2){
				s3[head++]=x1;
				S1.erase(S1.begin());
			}
			else{
				it=S1.end(); --it;
				s3[tail--]=*it;
				S1.erase(it);
			}
		}
		else{
			if(x1<x2){
				s3[head++]=x2;
				S2.erase(it);
			}
			else{
				s3[tail--]=*S2.begin();
				S2.erase(S2.begin());
			}
		}
	}
	s3[n+1]=‘\0‘;
	puts(s3+1);
	return 0;
}

【貪心】【multiset】Tinkoff Challenge - Final Round (Codeforces Round #414, rated, Div. 1 + Div. 2) C. Naming Company