洛谷P1786 幫貢排序 題解
阿新 • • 發佈:2021-01-05
幫貢排序 - 洛谷
description:
一種神奇的排序方式。
solution:
仔細做即可,注意處理多個屬性相同時編號的先後。
code:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
map<string,int>mp;
struct ben
{
string Name;
int Pos;
int c;
int lev;
int id;
string qaq;
}a[10005],b[1005];
int cmp(const ben &a,const ben &b)
{
if(a.c==b.c)return a.id<b.id;
return a.c>b.c;
}
int cmp2(const ben &a,const ben &b)
{
if(mp[a.qaq]==mp[b.qaq])return a.lev>b.lev;
return mp[a.qaq]<mp[b.qaq];
}
int cmp3(const ben &a,const ben &b)
{
if(mp[a.qaq]==mp[b.qaq])
{
if(a.lev==b.lev)return a.id<b.id;
return a.lev>b.lev;
}
return mp[a.qaq]<mp[b.qaq];
}
int main()
{
int n;
scanf("%d",&n);
string tmp;
mp["BangZhu"]=1;
mp["FuBangZhu"]=2;
mp["HuFa" ]=3;
mp["ZhangLao"]=4;
mp["TangZhu"]=5;
mp["JingYing"]=6;
mp["BangZhong"]=7;
string aaa;
int cnt=0,sum=0;
for(int i=1;i<=n;i++)
{
cin>>aaa>>tmp;
if(tmp=="BangZhu"||tmp=="FuBangZhu")
{
cnt++;
scanf("%d%d",&b[cnt].c,&b[cnt].lev);
b[cnt].Name=aaa;
b[cnt].Pos=mp[tmp];
b[cnt].qaq=tmp;
b[cnt].id=i;
}
else
{
a[++sum].Name=aaa;
scanf("%d%d",&a[sum].c,&a[sum].lev);
a[sum].Pos=mp[tmp];
a[sum].id=i;
}
}
sort(b+1,b+cnt+1,cmp3);
for(int i=1;i<=cnt;i++)
{
cout<<b[i].Name<<' '<<b[i].qaq<<' '<<b[i].lev<<endl;
}
sort(a+1,a+sum+1,cmp);
for(int i=1;i<=2;i++)
{
a[i].qaq="HuFa";
}
for(int i=3;i<=6;i++)
{
a[i].qaq="ZhangLao";
}
for(int i=7;i<=13;i++)
{
a[i].qaq="TangZhu";
}
for(int i=14;i<=38;i++)
{
a[i].qaq="JingYing";
}
for(int i=39;i<=n;i++)
{
a[i].qaq="BangZhong";
}
sort(a+1,a+sum+1,cmp3);
for(int i=1;i<=sum;i++)
{
cout<<a[i].Name<<' '<<a[i].qaq<<' '<<a[i].lev<<endl;
}
return 0;
}