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 3Sample 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); } }