[PAT解题报告] Mice and Rice

简单题,有趣的背景:题目给定了n个程序员用程序制作了n个老鼠,每人制作一个,所有的老鼠重量都不同,把它们每m个分为一组,不足m个话,余数也分为一组,然后每组最重的老鼠获胜进入下一轮,失败的老鼠名次是相同的,老鼠对应程序员…… 问最后每个人的名次。

主要问题在于: 下一轮有多少组? 如果现在剩余remain只老鼠,下一轮应该剩余 next = (remain + m - 1) / m只 ,其实是需要上取整,对于正整数,我们加上m - 1, 再除以m(下)取整就等于上取整了。那本轮淘汰的那些的名次都应该是(next + 1),因为这next个人占据next这么多个位置……
所以我们不断循环直到remain等于为止就好了。

注意老鼠和程序员的对应关系,还有不足m个的组也要单独看作一个组……

代码:
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

int a[1024],b[1024], r[1024];
int main() {
int n,m;
    scanf("%d%d",&n,&m);
    for (int i = 0; i < n; ++i) {
        scanf("%d", a + i);
    }
    for (int i = 0; i < n; ++i) {
        scanf("%d",b + i);
    }
    for (int remain = n;remain > 1; ) {
        int next = (remain + m - 1) / m, num = 0;
        for (int i = 0; i < remain; i += m) {
            int p = -1;
            for (int j = 0; (j < m) && (i + j < remain); ++j) {
                p = max(p, a[b[i + j]]);
            }    
            for (int j = 0; (j < m) && (i + j < remain); ++j) {
                if (p == a[b[i + j]]) {
                    b[num++] = b[i + j];
                }
                else {
                    r[b[i + j]] = next + 1;
                }
            }
            
        }
        remain = next;
    }
    r[b[0]] = 1;
    for (int i = 0; i < n; ++i) {
        if (i) {
            putchar(' ');
        }
        printf("%d",r[i]);
    }
    puts("");
    return 0;
}


原题链接: http://www.patest.cn/contests/pat-a-practise/1056
全部评论

相关推荐

4 收藏 评论
分享
牛客网
牛客企业服务