AT_code_festival_2017_qualb_f Largest Smallest Cyclic Shift 题解
题目传送门
根据字典序的性质,容易想到,在字典序最小的时候,一定以 a
开头,但是此时我们要保证字典序最大,那么后面就紧跟的是 c
,然后再是 b
。
这是字符的拼接,我们可以考虑扩展到字符串的拼接:我们可以由
此时我们只需要讨论
那么,我们发现规律,每次有字符串集取最大和最小拼接在一起,然后再和其它字符串匹配。这个结论可以用数学归纳法证明:
上文已经证明了
同时取最大和最小,用 std::multiset
维护,时间复杂度
#include<bits/stdc++.h>
using namespace std;
multiset<string> s;
int a,b,c;
int main(){
cin>>a>>b>>c;
while(a--) s.insert("a");
while(b--) s.insert("b");
while(c--) s.insert("c");
while(s.size()>1){
auto a=s.begin(),b=(--s.end());
s.insert((*a)+(*b)),s.erase(b),s.erase(a);
}
cout<<(*s.begin())<<endl;
return 0;
}