有n个老鼠,第一行给出n个老鼠的重量,第二行给出他们的顺序。
1.每一轮分成若干组,每组m个老鼠,不能整除的多余的作为最后一组。
2.每组重量最大的进入下一轮。
让你给出每只老鼠最后的排名。
很简单,用两个数组模拟一下即可
order1存储进入当前一轮老鼠的索引顺序
order2存储进入下一轮老鼠的索引顺序
如果当前有groups个组,那么会有groups个老鼠进入下一轮,则没有进入下一轮的排名都为groups+1
如果只有一个组,那么最大的那个排名即为1。
#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> using namespace std; const int maxn=1000+5; struct Mice{ int weight; int ranks; }mice[maxn]; int order1[maxn]; int cnt1=0; int order2[maxn]; int cnt2=0; int main() { int n,m; scanf("%d %d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",&mice[i].weight); } for(int i=0;i<n;i++){ scanf("%d",&order1[i]); } cnt1=n; int rRanks=0; int groups; while(1){ rRanks++; cnt2=0; int maxw,maxid; groups=cnt1/m; if(cnt1%m!=0) groups++; for(int i=0;i<cnt1;i+=m){ maxw=0; int v; for(int j=i;j<i+m&&j<cnt1;j++){ v=order1[j]; if(mice[v].weight>maxw){ maxw=mice[v].weight; maxid=v; } } for(int j=i;j<i+m&&j<cnt1;j++){ v=order1[j]; if(v!=maxid) mice[v].ranks=groups+1;//有groups个组,那么晋级下一轮的就有groups个人,所有没晋级的并列第groups+1名。 } order2[cnt2++]=maxid; } if(cnt1<=m){ mice[maxid].ranks=1; break; } for(int i=0;i<cnt2;i++){ order1[i]=order2[i]; } cnt1=cnt2; } printf("%d",mice[0].ranks); for(int i=1;i<n;i++){ printf(" %d",mice[i].ranks); } return 0; }