宝鸡市网站建设_网站建设公司_VPS_seo优化
2025/12/23 19:14:55 网站建设 项目流程



这一题的大意是说Np个老鼠参加比赛,相邻Ng个分成一组进行选拔,每组中选择最重的老鼠晋级,没有晋级的老鼠的排名一个样,按照这种思路给所有的老鼠进行排名,如果最后剩下不足Ng个仍可以分成一组,排名是跟分组个数相关。
这一题最开始我不理解的就是怎么确定排名,后来才明白,先算出当前的组数,然后排名等于组数+1,用测试样例验证是符合的。我们可以采用队列按照题目要求的顺序来保存老鼠的体重和索引,然后对一个个出队,在出队的过程中,我们找最大的体重和与之对应的索引,同时给老鼠排名,每Ng个我们把这Ng个中最重的老师,保存到一个新的队列中,这样遍历完一轮队列,就可以把所有的晋级的老师放入新的队列中,当当前队列为空之后,我们可以把新队列中的晋级的老鼠再赋值回去。循环往复即可。
完整代码如下:

#include<bits/stdc++.h>#include<iostream>usingnamespacestd;//每个老鼠的目标是尽可能的吃的多去成为一个胖老鼠// 玩的顺序是随机的对应Np个人来说// 每NG个程序员组成一个队伍// 最胖的老鼠进入下一个顺序// 所由的失败者是相同的排名// Ng个赢家再组成一个队伍去找最后的赢家//给出体重和最初的排序intNp;intNg;structnode{intw;intorder;}n[1005];intans[1005];intorder[1005];boolflag;queue<node>q;intmain(){cin>>Np>>Ng;for(inti=0;i<Np;i++){intx;cin>>x;n[i].w=x;}for(inti=0;i<Np;i++){intx;cin>>x;order[i]=x;n[x].order=x;}for(inti=0;i<Np;i++){q.push(n[order[i]]);}intgroup;if(Np%Ng==0){group=Np/Ng;}else{group=Np/Ng+1;}intindex=0;intcnt=0;intmaxx=0;// cout<<group<<endl;queue<node>temp;while(!q.empty()){node cur=q.front();//cout<<cur.order<<endl;q.pop();ans[cur.order]=group+1;cnt++;if(cur.w>maxx){maxx=cur.w;index=cur.order;}if(cnt==Ng){temp.push(n[index]);cnt=0;maxx=0;index=0;}if(q.empty()&&cnt>0){temp.push(n[index]);cnt=0;maxx=0;index=0;intgroupnumber=temp.size();if(groupnumber%Ng==0){group=groupnumber/Ng;}else{group=groupnumber/Ng+1;}}if(q.empty()){//说明刚好正分q=temp;intgroupnumber=temp.size();if(groupnumber%Ng==0){group=groupnumber/Ng;}else{group=groupnumber/Ng+1;}while(!temp.empty()){temp.pop();}if(q.size()==1){ans[q.front().order]=1;break;}}}for(inti=0;i<Np;i++){if(i==0){cout<<ans[i];}else{cout<<" "<<ans[i];}}return0;}

总结:这一题是队列模拟,只要弄清楚题意,按逻辑模拟即可

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询