zoukankan      html  css  js  c++  java
  • 1056. Mice and Rice (25)

    Mice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the movements of a mouse in a given map. The goal of each mouse is to eat as much rice as possible in order to become a FatMouse.

    First the playing order is randomly decided for NP programmers. Then every NG programmers are grouped in a match. The fattest mouse in a group wins and enters the next turn. All the losers in this turn are ranked the same. Every NG winners are then grouped in the next match until a final winner is determined.

    For the sake of simplicity, assume that the weight of each mouse is fixed once the programmer submits his/her code. Given the weights of all the mice and the initial playing order, you are supposed to output the ranks for the programmers.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains 2 positive integers: NP and NG (<= 1000), the number of programmers and the maximum number of mice in a group, respectively. If there are less than NG mice at the end of the player's list, then all the mice left will be put into the last group. The second line contains NP distinct non-negative numbers Wi (i=0,...NP-1) where each Wi is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation of 0,...NP-1 (assume that the programmers are numbered from 0 to NP-1). All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the final ranks in a line. The i-th number is the rank of the i-th programmer, and all the numbers must be separated by a space, with no extra space at the end of the line.

    Sample Input:
    11 3
    25 18 0 46 37 3 19 22 57 56 10
    6 0 8 7 10 5 9 1 4 2 3
    
    Sample Output:
    5 5 5 2 5 5 5 3 1 3 5
    

    队列,首先给出一个顺序,先把数据读入队列,初始ran为1,然后开始扫队列,每次扫一遍,把每ng个中最大的加到队列尾部,其他的出队,同时更新每个number的ran,以及record。详见代码:

    #include <iostream>
    #include <queue>
    #include <cstdio>
    using namespace std;
    struct ranks
    {
        int num,w,r;///num是每个programmer对应的number  w是对应weight r是代表第几波被扫除队列的
        ranks(){}
        ranks(int numm,int ww,int rr):num(numm),w(ww),r(rr){}
    };
    int record[1000];///第i波被扫除队列的元素个数
    int main()
    {
        int np,ng;///np ng如题
        int s[1000],p,ran[1000],maxv;///s记录w ran记录对应number的r(即第几波被扫除)maxv记录最后一波只剩一个元素时的r
        queue<ranks> q;
        scanf("%d %d",&np,&ng);
        for(int i = 0;i < np;i ++)
        {
            scanf("%d",&s[i]);
        }
        for(int i = 0;i < np;i ++)
        {
            scanf("%d",&p);
            q.push(ranks(p,s[p],1));
        }
        record[1] = np;
        while(!q.empty())
        {
            int ma = 0,qsize = q.size();
            ranks wh,temp;
            for(int i = 1;i <= qsize;i ++)
            {
                temp = q.front();///队首给temp
                q.pop();///出队
                record[temp.r] ++;///对应更新record
                ran[temp.num] = temp.r;///更新ran
                if(temp.w > ma)ma = temp.w,wh = temp;///更新ma最大值
                if(i % ng == 0 || i == qsize)///每ng个元素一个group
                {
                    record[wh.r] --;///不该在这一波扫除,应该在下一波 对应record 改变
                    wh.r ++;
                    q.push(wh);
                    ran[wh.num] = wh.r;
                    ma = 0;
                }
            }
            if(q.size() == 1)///只剩一个元素则不需要在比较了
            {
                record[wh.r] ++;///不能忘记更新record
                maxv = wh.r;
                break;
            }
        }
        for(int i = maxv - 1;i >= 1;i --)
        {
            record[i] += record[i + 1];///倒着来看,越晚被扫除排名越高,记录自己之后被扫除的人数,方便输出排名
        }
        for(int i = 0;i < np;i ++)
        {
            int rand = record[ran[i] + 1] + 1;
            if(i == 0)printf("%d",rand);
            else printf(" %d",rand);
        }
    }

  • 相关阅读:
    第五周进度条
    《掌握需求过程》阅读笔记01
    第三周进度条
    问题账户需求分析
    2016年秋季阅读个人计划
    梦断代码阅读笔记03
    软件工程概论课程总结
    Python爬取上交所一年大盘数据
    Python爬取6271家死亡公司数据,看十年创业公司消亡史
    python:王思聪究竟上了多少次热搜?
  • 原文地址:https://www.cnblogs.com/8023spz/p/8126689.html
Copyright © 2011-2022 走看看