IDEA
1.需要vector:programer,order,used(初始化为0),used值为1的不进入下一轮
2.计算分组数:np%ng==0?group=np/ng:group=np/ng+1;
以group为循环依据group%ng==0?group=group/ng:group=group/ng+1;group==1则下一次不在循环
3.计算每组的最大值,记录其id,并给其他的赋排名,是当然group+1
CODE
#include<iostream>
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
struct Programmer{
int wei;
int rank;
};
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int np,ng;
cin>>np>>ng;
vector<Programmer> vec(np);
vector<int> order(np);
vector<int> used(np,0);
for(int i=0;i<np;i++){
cin>>vec[i].wei;
}
for(int i=0;i<np;i++){
cin>>order[i];
}
int group;
np%ng==0?group=np/ng:group=np/ng+1;
int max,max_index,count;
int flag=1;
while(flag){
if(group==1){
flag=0;
}
count=0;max=-1;max_index=-1;
for(int i=0;i<np;i++){
if(used[order[i]]==0){
if(count==ng){
max=-1;
max_index=-1;
count=1;
}else{
count++;
}
if(vec[order[i]].wei>max){
if(max_index!=-1){
vec[max_index].rank=group+1;
used[max_index]=1;
}
max=vec[order[i]].wei;
max_index=order[i];
}else{
vec[order[i]].rank=group+1;
used[order[i]]=1;
}
}
}
group%ng==0?group=group/ng:group=group/ng+1;
}
vec[max_index].rank=1;
for(int i=0;i<np;i++){
if(i==0){
cout<<vec[i].rank;
}else{
cout<<" "<<vec[i].rank;
}
}
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}