题目很蛋疼很蛋疼,很容易理解错题意,十分容易,不过多模拟几遍还是可以找到正确的实现的方法的。
第三行就是分组的顺序,数字表示的就是参与比赛的号码:
第三行的序列居然是给出依次要进行比较的老鼠的标号。
11 3 25 18 0 46 37 3 19 22 57 56 10 6 0 8 7 10 5 9 1 4 2 3先比较第6,0,8号老鼠,此为第一组,7,10,5为第二组,后面类推...
贴出AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | //第三行给出的是组队的顺序,即6 0 8一组,7 10 5一组。。。。。 //之后比较数组中应该是 8 7 9 3,这样8 7 9一组 //之后就是8 3, 两者比较出胜者, //循环直到只有一个胜者结束,模拟实现 #include<stdio.h> #include<algorithm> using namespace std; #define N 1005 int weight[N]; int order[N];//记录出场顺序 int neworder[N]; int rank1[N];//paiming bool visit[N];//记录是否在分组中 int num; //记录在分组中的个数 bool find(int i,int len){ int j; for(j=0;j<len;++j){ if(neworder[j]==i){ return true; } } return false; } int main(){ int n,m,i,j; scanf("%d %d",&n,&m); for(i=0;i<n;++i){ scanf("%d",&weight[i]); } for(i=0;i<n;++i){ scanf("%d",&order[i]); visit[i]=false; rank1[i]=1; } num=0; int len=n; int k,ans,t,max; while(num!=n-1){ k=0;//记录序号 ans=len/m; t=len%m; //printf("len=%d ans=%d t=%d\n",len,ans,t); if(ans!=0){ for(i=0;i<ans;++i){ max=-1; for(j=i*m;j<(i+1)*m;++j){ if(weight[order[j]]>max){ max=weight[order[j]]; neworder[k]=order[j];//记录出场顺序 } } k++;//每一组的M个产生一个胜者 } } if(t!=0){ max=-1; for(j=ans*m;j<len;j++){ if(weight[order[j]]>max){ max=weight[order[j]]; neworder[k]=order[j]; } } k++; } int shibai=len-k; for(i=0;i<n;++i){//更改所有排名,分组胜利的排名不改,分组中失败的排名+1,不在分组中的排名要加上失败人数 if(visit[i]==true){//不在分组中 rank1[i]+=shibai; continue; } if(visit[i]==false && find(i,k)==false){//在分组中失败的 rank1[i]+=1; visit[i]=true; num++; continue; } //剩下的都是胜者排名不变 } for(j=0;j<k;++j){ order[j]=neworder[j]; } len=k; }//while for(j=0;j<n-1;++j){ printf("%d ",rank1[j]); } printf("%d\n",rank1[n-1]); return 0; } |