按照思路做了一下这道题。
大致想法是输入的时候将职位这一栏进行查找给每个人一个权重,职位越高的权重越大。 同时给每个人一个序号以便于在排序后:
输入完成后将所有数据先排一遍序,首先尝试按权重排,权重相同的按等级,等级相同按输入顺序。
再进行第二次排序,由于第一次排序将权重最高的靠前,所以前三个数据必定是帮主以及两位副帮主。因此从第四个数据开始排序,按照帮贡排序,帮贡相同职位权重进行排序。最后给每个人一个新的职位权重。
但是不知道为什么过不去测试点2.想不到哪里有问题...
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;
struct Person{
string name;
int weight;
int contributionValue;
int level;
int xh;
};
int cmp(const void *p1, const void *p2){
Person ps1 = *(Person *)p1;
Person ps2 = *(Person *)p2;
if(ps1.weight != ps2.weight){
return ps1.weight < ps2.weight;
}else{
if(ps1.level != ps2.level){
return ps1.level < ps2.level;
}
return ps1.xh > ps2.xh;
}
}
int cmp2(const void *p1, const void *p2){
Person ps1 = *(Person *)p1;
Person ps2 = *(Person *)p2;
if(ps1.contributionValue != ps2.contributionValue){
return ps1.contributionValue < ps2.contributionValue;
}else{
return ps1.weight < ps2.weight;
}
}
int main(){
string strs[7] = {
"BangZhong",
"JingYing",
"TangZhu",
"ZhangLao",
"HuFa",
"FuBangZhu",
"BangZhu"
};
int n, positionCount[5] = {2,4,7,25,9999};
Person *p;
cin>>n;
p = new Person[n];
for(int i = 0; i < n; i++){
p[i].xh = i;
cin>>p[i].name;
string zw;
cin>>zw;
for(int j = 0; j < 7; j++){
if(!strs[j].compare(zw)){
p[i].weight = j;
break;
}
}
cin>>p[i].contributionValue;
cin>>p[i].level;
}
qsort(p, n, sizeof(p[0]), cmp);
qsort(p + 3, n - 3, sizeof(p[0]), cmp2);
/*for(int i = 0; i < n; i++){
cout<<p[i].name<<" weight:"<<p[i].weight<<" contributionValue:"<<p[i].contributionValue<<endl;
}*/
for(int i = 3, index = 0; i < n; index++){
for(int j = 0; j < positionCount[index] && i != n; j++, i++){
p[i].weight = 4 - index;
}
}
qsort(p + 3, n - 3, sizeof(p[0]), cmp);
for(int i = 0; i < n; i++){
cout<<p[i].name<<" "<<strs[p[i].weight]<<" "<<p[i].level<<endl;
}
}