题解 洛谷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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!