PAT 1056 Mice and Rice

#include <cstdio>

#include <climits>

#include <cstdlib>

#include <vector>

#include <list>



using namespace std;



list<int>::iterator group_pick(list<int> &player, list<int>::iterator &cur, int group_size, vector<int> &W) {

    int wmax = INT_MIN;

    list<int>::iterator ret = player.end();

    int cnt = group_size;

    //printf("check group:\n\t");

    while (cur != player.end() && cnt > 0) {

        --cnt;

        //printf(" %d(%d)", *cur, W[*cur]);

        if (W[*cur] >= wmax) {

            wmax = W[*cur];

            ret = cur;

        }

        cur++;

    }

    //printf("\n");

    return ret;

}



int main() {



    int N = 0, G = 0;

    scanf("%d%d", &N, &G);

    

    if (N < 1) return 0;

    

    vector<int> W(N,  0);

    vector<int> R(N, 0);

    vector<int> L;

    list<int> P;

    

    for (int i=0; i<N; i++) {

        scanf("%d", &W[i]);

    }

    for (int i=0; i<N; i++) {

        int t = 0;

        scanf("%d", &t);

        P.push_back(t);

    }

    

    int level = 0;

    int level_cnt = 0;

    

    list<int> tmp;

    auto cur = P.begin();

    // number of elements in P should be larger than 1 to perform reduce processing

    while (G > 1 && ++(cur = P.begin()) != P.end()) {

        tmp.clear();

        auto cur = P.begin();

        while (cur != P.end()) {

            list<int>::iterator fat = group_pick(P, cur, G, W);

            //printf("pick %d\n", *fat);

            tmp.splice(tmp.end(), tmp, fat);

        }

        

        swap(tmp, P);

        auto iter = tmp.begin();

        while (iter != tmp.end()) {

            R[*(iter++)] = level;

            level_cnt++;

        }

        L.push_back(level_cnt);

        level_cnt = 0;

        level++;

    }

    // now there must be only one element in P, the final winner

    L.push_back(1);

    R[P.front()] = level;

    int sum = 0;

    for (int i=L.size() - 1; i>=0; i--) {

        //printf("level cnt: %d\n", L[i]);

        int next_sum = sum + L[i];

        L[i] = sum + 1;

        sum  = next_sum;

    }



    int len = R.size();

    printf("%d", L[R[0]]);

    for (int i=1; i<len; i++) {

        printf(" %d", L[R[i]]);

    }

    return 0;

}

有点烦啊

你可能感兴趣的:(ICE)