https://hihocoder.com/problemset/problem/1327
给定你一个字符串,问你是否能变成不相同的字符在一起的那种形式,如果可以的话,输出最小字典序。否则输出INVALID
思路:贪心,每次从最小的开始试,看剩下的字符串是否能构建成功,如果能则构建,否则则不可以。
条件是 某一个字符是否存在 大于(x+1)/2
因为 axaxa 是最多的情况 为(x+1)/2
#include <bits/stdc++.h>
using namespace std;
/* 暴力枚举就行。
注意截止的条件,从a-z方向开始枚举
*/
const int maxn=1e5+1000;
char a[maxn];
int sum[26];
bool judge(int x){
for(int i=0;i<26;i++){
if(sum[i]>(x+1)/2)
return false;
}
return true;
}
vector<char>q;
int main()
{ cin>>a;
int len=strlen(a);
for(int i=0;i<len;i++){
sum[a[i]-'a']++;
}
int ans=len;
bool flag;
bool kk=false;
int pre=-1;
if(!judge(len))
kk=true;
for(int i=0;i<len&&!kk;i++){
flag=false;
for(int j=0;j<26&&!flag;j++){
if(sum[j]&&j!=pre){
sum[j]--;
if(judge(ans-1))
{flag=true;
q.push_back('a'+j);
pre=j;
ans--;
}
else
sum[j]++;
}
}
if(!flag)
{ kk=true;break;}
}
q.push_back('\n');
if(!kk)
for(int i=0;i<q.size();i++){
printf("%c",q[i]);
}
else
puts("INVALID");
return 0;
}