0w1

UVA 10905 Children's Game ( Ad hoc )

UVa Online Judge
挺有趣的一道題。一開始很直覺的直接比較字典序,WA了一波才想到問題在於長度相異的時候比較時,像是 cmp( 2, 27 ) 和 cmp( 2, 21 ) 是不同的,前者要回傳 false使成為 272,而後者要回傳 true使成為 221才會對。所以這時候應該要直接比較 a + b 還是 b + a 字典序大。後來看了人家 code才想到其實直接比較這件事就可以了,長度相同相異根本沒差。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50 + 5;

int n;
string num[MAXN];

bool cmp(const string &a, const string &b){
    for(int i = 0; i < a.size(); ++i){
        if( i >= b.size() ) return a + b > b + a;
        if( a[ i ] != b[ i ] ) return a[ i ] > b[ i ];
    }
    return a + b > b + a;
}

int main(){
    ios::sync_with_stdio( false );
    while( cin >> n && n ){
        for(int i = 0; i < n; ++i)
            cin >> num[ i ];
        sort( num, num + n, cmp );
        for(int i = 0; i < n; ++i)
            cout << num[ i ];// << " ";
        cout << endl;
    }
    return 0;
}