题解 洛谷P1786 【帮贡排序】

\(Sol\)

显然,这道题目是一道排序题。
相信每个人都能看出来。
但是我知道,大家都想问:怎么排序
其实按照题目意思模拟即可。

  • 首先,题目中说到,帮主和副帮主次序不变,我们不妨将他们的帮贡都设为\(\infty\)
  • 然后,我们进行第一次排序:帮贡为第一关键字,原序号为第二关键字。
  • 其次,我们按照他们的排序顺序,重新给职位。
  • 最后,我们再进行第二次排序:职位为第一关键字,等级为第二关键字,原序号为第三关键字。
    再输出即可!

\(Code\)

#include<bits/stdc++.h>
using namespace std;
int N;
map<string,int>Order;
struct Struct
{
	string Name;
	string Position;
	int Contribution;
	int Level;
	int Id;
}Array[111];
inline bool Compare1(Struct A,Struct B)
{
	return A.Contribution!=B.Contribution?A.Contribution>B.Contribution:A.Id<B.Id;
}
inline bool Compare2(Struct A,Struct B)
{
	if(A.Position!=B.Position)
	{
		return Order[A.Position]>Order[B.Position];
	}
	if(A.Level!=B.Level)
	{
		return A.Level>B.Level;
	}
	return A.Id<B.Id;
}
int main(void)
{
	register int i;
	cin>>N;
	Order["BangZhu"]=7;
	Order["FuBangZhu"]=6;
	Order["HuFa"]=5;
	Order["ZhangLao"]=4;
	Order["TangZhu"]=3;
	Order["JingYing"]=2;
	Order["BangZhong"]=1;
	for(i=1;i<=N;i++)
	{
		cin>>Array[i].Name;
		cin>>Array[i].Position;
		cin>>Array[i].Contribution;
		cin>>Array[i].Level;
		Array[i].Id=i;
		if(Order[Array[i].Position]==7)
		{
			Array[i].Contribution=2147483647;
		}
		if(Order[Array[i].Position]==6)
		{
			Array[i].Contribution=2147483646;
		}
	}
	sort(Array+1,Array+N+1,Compare1);
	for(i=1;i<=N;i++)
	{
		if(i==1)
		{
			Array[i].Position="BangZhu";
		}
		if(i>=2&&i<=3)
		{
			Array[i].Position="FuBangZhu";
		}
		if(i>=4&&i<=5)
		{
			Array[i].Position="HuFa";
		}
		if(i>=6&&i<=9)
		{
			Array[i].Position="ZhangLao";
		}
		if(i>=10&&i<=16)
		{
			Array[i].Position="TangZhu";
		}
		if(i>=17&&i<=41)
		{
			Array[i].Position="JingYing";
		}
		if(i>=42)
		{
			Array[i].Position="BangZhong";
		}
	}
	sort(Array+1,Array+N+1,Compare2);
	for(i=1;i<=N;i++)
	{
		cout<<Array[i].Name<<' '<<Array[i].Position<<' '<<Array[i].Level<<endl;
	}
	return 0;
}
posted @ 2020-08-12 17:00  Bushuai_Tang  阅读(328)  评论(2编辑  收藏  举报