【洛谷】P1786 幫貢排序 2020-11-07

沾liana發表於2020-11-07

【洛谷】P1786 幫貢排序

簡單結構體排序題,用bool函式加sort就可以。主要的點是如果需要按某種奇怪的順序排序的話,就把那個奇怪的順序表上號好了。

題解:(還是多加註釋比較好)

//給幫貢最多的護法的職位,其次長老,以此類推。

//樂斗的顯示並不按幫貢排序而按職位和等級排序。 

//求出最後樂鬥顯示的列表(在他調整過職位後):職位第一關鍵字,等級第二關鍵字。 

#include<iostream>
#include<string.h>
#include<algorithm>

using namespace std;

struct xingyue{
	string name;
	string posit;
	int bangg;
	int grade;
	int num;
	int numposit;
};

bool cmpb(xingyue x,xingyue y)
{
	if(x.bangg==y.bangg)
		return x.num<y.num;
	else
		return x.bangg>y.bangg;
}

bool cmpd(xingyue x,xingyue y)   //職位相同按等級,等級相同按序號 
{
	if(x.numposit==y.numposit)
	{
		if(x.grade==y.grade)
			return x.num<y.num;
		return x.grade>y.grade;
	}
	return x.numposit<y.numposit; 
	
}

int main()
{
	int n;
	cin>>n;
	xingyue bang[n+1];
	
	for(int i=1;i<=n;i++)
	{
		cin>>bang[i].name>>bang[i].posit>>bang[i].bangg>>bang[i].grade;
		bang[i].num=i;
	}
	sort(bang+1,bang+n+1,cmpb); //排幫貢 (幫貢相同排序號)
	
	int count=1;
	for(int i=1;i<=n;i++)
	{
	    if(bang[i].posit!="BangZhu"&&bang[i].posit!="FuBangZhu") 
	    {
	    	if(count<=2) 
			{
				bang[i].posit="HuFa";
				bang[i].numposit=3;
			}
			else if(count>2&&count<=6)
			{
				bang[i].posit="ZhangLao";
				bang[i].numposit=4;
			}
			else if(count>6&&count<=13)
			{
				bang[i].posit="TangZhu";
				bang[i].numposit=5;
			}
			else if(count>13&&count<=38)
			{
				bang[i].posit="JingYing";
				bang[i].numposit=6;
			}
			else
			{
				bang[i].posit="BangZhong";
				bang[i].numposit=7;
			}
			count++;
		}
		else if(bang[i].posit=="BangZhu")
		{
			bang[i].numposit=1;
		}
		else if(bang[i].posit=="FuBangZhu")
		{
			bang[i].numposit=2;
		}	
	}
	sort(bang+1,bang+n+1,cmpd);
	for(int i=1;i<=n;i++)
	{
		cout<<bang[i].name<<' '<<bang[i].posit<<' '<<bang[i].grade<<endl;
	}

	
	return 0;
}

相關文章