求助,90分,第二个点不知道为啥错.
查看原帖
求助,90分,第二个点不知道为啥错.
135890
神乐Triste楼主2020/12/4 11:30

按照思路做了一下这道题。

大致想法是输入的时候将职位这一栏进行查找给每个人一个权重,职位越高的权重越大。 同时给每个人一个序号以便于在排序后:

等级相同的,原来靠前的现在也要靠前

输入完成后将所有数据先排一遍序,首先尝试按权重排,权重相同的按等级,等级相同按输入顺序。

再进行第二次排序,由于第一次排序将权重最高的靠前,所以前三个数据必定是帮主以及两位副帮主。因此从第四个数据开始排序,按照帮贡排序,帮贡相同职位权重进行排序。最后给每个人一个新的职位权重。

但是不知道为什么过不去测试点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; 
	}
}
2020/12/4 11:30
加载中...