Cod sursa(job #542465)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 26 februarie 2011 13:58:57
Problema Sortari2 Scor 20
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.44 kb
#include <algorithm>
#include <cstring>
#include <fstream>

using namespace std;

const char Input[] = "sortari2.in";
const char Output[] = "sortari2.out";

const int Dim = 1001;
const int Mod = 999017;

int N, XXX;
int p[Dim], aux[Dim];

inline int SortI() {

    int i, j, cnt;

    cnt = 0;
    memcpy( aux, p, sizeof( p ) );

    for( i = 1; i <= N; ++i )
        if( aux[i] != i ) {

            for( j = i + 1; j <= N; ++j )
                if( aux[j] == i ) {

                    swap( aux[i], aux[j] );
                    break;
                }
            ++cnt;
        }

    return cnt;
}

inline int SortB() {

    bool ok;
    int i, cnt;

    cnt = 0;
    memcpy( aux, p, sizeof( p ) );

    do {

        ok = false;
        for( i = 1; i < N; ++i )
            if( aux[i] > aux[i + 1] ) {

                swap( aux[i], aux[i + 1] );
                ++cnt;
                ok = true;
            }
    }
    while( ok == true );

    return cnt;
}

int main() {

    ifstream fin( Input );
    ofstream fout( Output );

    int i;

    fin >> N;
    for( i = 1; i <= N; ++i )
        p[i] = i;

    do {

        if( SortI() < SortB() ) {

            ++XXX;
            if( XXX > Mod )
                XXX -= Mod;
        }
    }
    while( next_permutation( p + 1, p + N + 1 ) );

    fout << XXX % Mod;

    fin.close();
    fout.close();

    return 0;
}