题解 P1786 【帮贡排序】
【思路】
模拟,排序
【题目大意】
根据题目中给出的条件赋予职位
然后排序
【题目分析】
排序这是很显然的,但是一道绿题不可能让你一个sort就水过去吧?
不过也不可能出什么恶心的数据结构来,毕竟只是一道绿题。
所以难度只会存在于排序的条件
也就是到底什么样的才应该在前面
【排序条件】
无权调动帮主,副帮主和自己
所以帮主,副帮主和自己是不需要挪动的
然后就看排序的顺序了
需要两次排序
第一次是为了给予职位,第二次是为了输出
给予职位是按照帮贡来给
还有如果有相同帮贡但是职位不够的话原来当的应该继续当
这不需要考虑
因为原来当的一开始读入就在前面
sort排序的时候只要不在cmp里面加上个=就会按照原来当的在前面排序
这样就能保证原来当的优先当了
职位是第一要素这很显然
等级是第二关键字
所以要先按照职位排序
然后如果职位相同那就把等级高的放在前面
再就是职位相同等级也相同的话
那原来在前面的就还在前面
这点不需要考虑
因为如果用sort的话
只要cmp里面自定义排序方式写正确了那就没有问题
(这里的正确很大可能是不需要=,主要是看你怎么写)
【完整代码】
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
map<string,int>s;
const int Max = 120;
struct node
{
string name,zhiwei;//名字,职位
int bg,dg;//帮贡,等级
int zz;//一开始给出数据中所在的位置
}a[Max];
bool cmp(const node x,const node y)//帮贡排序
{
if(x.bg == y.bg)
return x.zz < y.zz;
return x.bg > y.bg;
}
bool cmp1(const node x,const node y)//输出排序
{
if(s[x.zhiwei] == s[y.zhiwei])
{
if(x.dg == y.dg)
return x.zz < y.zz;
return x.dg > y.dg;
}
else
return s[x.zhiwei] < s[y.zhiwei];
}
int main()
{
s["BangZhu"] = 1,s["FuBangZhu"] = 2,s["HuFa"] = 3,s["ZhangLao"] = 4,
s["TangZhu"] = 5,s["JingYing"] = 6,s["BangZhong"] = 7;
int n;
cin >> n;
for(register int i = 1;i <= n;++ i)
cin >> a[i].name >> a[i].zhiwei >> a[i].bg >> a[i].dg,a[i].zz = i;
int js = 0;
sort(a + 4,a + 1 + n,cmp);
int jj = 1;
for(register int i = 1;i <= n;++ i)
{
if(a[i].zhiwei != "BangZhu" && a[i].zhiwei != "FuBangZhu")
{
if(jj >= 1 && jj <= 2)
a[i].zhiwei = "HuFa";
if(jj >= 3 && jj <= 6)
a[i].zhiwei = "ZhangLao";
if(jj >= 7 && jj <= 13)
a[i].zhiwei = "TangZhu";
if(jj >= 14 && jj <= 38)
a[i].zhiwei = "JingYing";
if(jj >= 39)
a[i].zhiwei = "BangZhong";
jj ++;
}
}
sort(a + 1,a + 1 + n,cmp1);
for(register int i = 1;i <= n;++ i)
cout << a[i].name << " " << a[i].zhiwei << " " << a[i].dg << endl;
return 0;
}