1056. Mice and Rice (25) 排序 模拟 构造结构体

1056. Mice and Rice (25)题目地址

做题的时候可以先模拟一下,主要是构造一个结构体,知道每一层如何操作的,该层结束之后还剩下多少人。这里用到了vector对结构体的不同规则排序

/* http://www.patest.cn/contests/pat-a-practise/1056 1056. Mice and Rice (25) 一次ac */
#include <iostream> 
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>

using namespace std;

#define N 10001

int n, m;

struct mydata{
    int weight; 
    int no; // 最开始的编号 , 最后得按照no输出相应名次
    int order;
    int cengshu; // 可以到第几层
    int rank; // 最终排序
};

vector<mydata> v;

bool cmp(mydata d1, mydata d2)
{
    if (d1.cengshu > d2.cengshu)
        return true;
    if (d1.cengshu == d2.cengshu)
    {
        return d1.order < d2.order;
    }
    return false;
}

int maxPos( int m, int sta)
{
    int maxP = v[sta].weight;
    int pos = sta;
    int i;
    for (i = sta+1; i < sta + m && i < n; i++)
    {
        if (v[i].weight > maxP)
        {
            maxP = v[i].weight;
            pos = i;
        }
    }
    return pos;
}

bool cmp2(mydata d1, mydata d2)
{
    return d1.no < d2.no;
}

int main()
{
    //freopen("in", "r", stdin);
    while (scanf("%d%d", &n, &m) != EOF)
    {
        int i;
        int tmp;
        mydata dt;
        for (i = 0; i < n; i++)
        {
            scanf("%d", &tmp);
            dt.weight = tmp; 
            dt.no = i;
            dt.cengshu = 1;
            v.push_back(dt);
        }
        for (i = 0; i < n; i++)
        {
            scanf("%d", &tmp);
            v[tmp].order = i;
        }

        sort(v.begin(), v.end() ,cmp);

        int num = n;
        int cengshu = 2;
        while (num != 1)
        {
            int cishu = num / m;
            for (i = 0; i < num; i+=m)
            {
                int t = maxPos(m, i);
                v[t].cengshu = cengshu;
            }

            sort(v.begin(), v.end(), cmp);

            if (num % m == 0) // 下一层的人数为 num
                num = num / m;
            else
                num = num / m + 1;
            cengshu++;
        }

        v[0].rank = 1;
        for (i = 1; i < n; i++)
        {
            if (v[i].cengshu == v[i - 1].cengshu)
            {
                v[i].rank = v[i - 1].rank;
            }
            else{
                v[i].rank = i + 1;
            }
        }

        sort(v.begin(), v.end(), cmp2);
        printf("%d", v[0].rank);
        for (i = 1; i < n; i++)
        {
            printf(" %d", v[i].rank);
        }
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(结构体-排序)