天天看點

【貪心】[Atcoder Grand Contest 022]A Diverse Word

題意:

定義一個完美的字元串表示為:字元串中沒有出現兩個相同的字元。

現在給出一個完美的字元串,求字典序比它大的最小的完美的字元串。

若沒有輸出-1

分析:

首先,如果給出的字元串長度不為26,那麼直接在其後加入一個最小的沒出現的字元,必然是字典序盡量小的。

再考慮長度已經為26的字元串,顯然不能再加入字元了,隻能将某個字元替換為在它後面的比它大的最小的字元,再将後面清空,就是最優的方案。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define SF scanf
#define PF printf
#define MAXN 30
using namespace std;
char s[MAXN];
bool used[MAXN];
int main(){
    SF("%s",s);
    int len=strlen(s);
    for(int i=;i<len;i++)
        used[s[i]-'a']=;
    for(int i=;i<;i++)
        if(used[i]==){
            PF("%s%c",s,i+'a');
            return ;
        }
    for(int i=len-;i>=;i--){
        int minid=-;
        for(int j=i+;j<len;j++)
            if(s[j]>s[i]&&(minid==-||s[minid]>s[j]))
                minid=j;
        if(minid!=-){
            for(int j=;j<i;j++)
                PF("%c",s[j]);
            PF("%c",s[minid]);
            return ;
        }
    }
    PF("-1");
}