题目链接:
题目描述:
这题啊…..好难懂啊。
输入描述:
11 3
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3
输出:
5 5 5 2 5 5 5 3 1 3 5
输入的第三行是初始比赛顺序。
第6、0、8个mice先组成一组进行比较,第8个mice的W是57最大晋级,同理第7、10、5个mice是22、10、3,第7个晋级,第9、1、4个mice是56、18、37,第9个晋级,剩下的只有第2、3个mice,是0、46,第3个晋级,于是第8、7、9、3一共4个mice晋级到下一轮,并继续按照这个顺序比较,那么其他没有晋级的mice的排名都是第5名。
第8、7、9、3个mice吃到的rice分别是57、22、56、46,前三个中第8个晋级,剩下的第3个也晋级,所以未晋级的7、9的排名都是第3。
第8、3个mice的排名分别是第1和第2了。
这里有一点比较关键的就是未晋级的mice的排名名次的计算,知道了当前要比赛的mice的数量之后就可以计算出一共会有多少晋级,那么未晋级的mice的名次就都是本轮晋级数目+1了。
题目分析:
(╯‵□′)╯︵┻━┻ 模拟题写起来好暴躁啊。
还是要多练啊…..
用队列,一个队列q1放此轮比赛参加的mice的id,一个优先队列q2放该轮每组的mice,第一个肯定是晋级的那个,失败的排名相同,还有一个队列q3放此轮晋级的mice的id….q1=q3.然后进入下一轮。代码太挫了…..以后有时间得重写。
代码:
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int NP, NG;
struct Mice{
int id;
int weight;
int rank;
};
struct cmp{
bool operator() (const Mice* m1, const Mice* m2){
return (*m1).weight < (*m2).weight;
}
};
int main()
{
scanf("%d%d",&NP,&NG);
Mice* mices = new Mice[NP];
for (int i = 0; i < NP; i++){
mices[i].id = i;
scanf("%d",&mices[i].weight);
}
queue<int> q1;
int order;
for (int i = 0; i < NP; i++){
scanf("%d",&order);
q1.push(order);
}
while (!q1.empty()){
int rank;
if (q1.size() % NG == 0){
rank = q1.size() / NG+1;
}
else{
rank = q1.size() / NG + 2;
}
queue<int> q3;
priority_queue<Mice*, vector<Mice*>, cmp> q2;
while (!q1.empty()){
for (int i = 0; !q1.empty()&&i < NG; i++){
order = q1.front();
q1.pop();
q2.push(&mices[order]);
}
Mice* m;
if(!q2.empty()){
m = q2.top();
q2.pop();
if (rank == 2){
(*m).rank = 1;
}
else{
q3.push((*m).id);
}
}
while (!q2.empty()){
m = q2.top();
(*m).rank = rank;
q2.pop();
}
}
q1 = q3;
}
printf("%d",mices[0].rank);
for (int i = 1; i < NP; i++){
printf(" %d",mices[i].rank);
}
return 0;
}