题目链接
给帮派打广告都打到算法网站了.jpg 我也干过啊,那没事了
令人窒息的一道模拟,算法基本是一目了然级别的,奈何要素实在太多,敲的时候莫名暴躁.
#include <bits/stdc++.h>
using namespace std;
const int N = 150;
struct users//用户结构体
{
string id;//用户名
int post;//职位代号
int point;//贡献
int lv;//等级
int t;//出现顺序
};
bool cmp1(users a,users b)//帮贡排序,用来重新分配职业
{
if(a.point != b.point)
return a.point > b.point;
else
return a.t < b.t;
}
bool cmp2(users a,users b)//乐斗排序,职位第一等级第二
{
if(a.post != b.post)
return a.post < b.post;
else if(a.lv != b.lv)
return a.lv > b.lv;
else
return a.t < b.t;
}
int n;//总人数
users user[N];//用户列表
string postName[7] = {"BangZhu","FuBangZhu","HuFa","ZhangLao","TangZhu","JingYing","BangZhong"};//职位对照表
int maxPost[7] = {1,2,2,4,7,25,N};//职位最高人数限制
int nowPost[7];//职位现有人数
void display(users a)//输出函数
{
cout << a.id << ' ' << postName[a.post] << ' ' << a.lv << endl;
}
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
{
string zw;//临时职位
cin >> user[i].id >> zw >> user[i].point >> user[i].lv;
user[i].t = i;//分配顺序
for(int j = 0 ; j < 7 ; j++)//分配职位
if(zw == postName[j])
{
user[i].post = j;
break;
}
}
//重新分配职业
sort(user,user + n,cmp1);//首先按帮贡排序
int postFlag = 2;//从长老开始分
for(int i = 0 ; i < n ; i++)
{
if(!user[i].post || user[i].post == 1)//跳过不能分配的帮主和副帮主
continue;
user[i].post = postFlag;//重新分配职业
nowPost[postFlag]++;//职业人数+1
if(nowPost[postFlag] == maxPost[postFlag])//当前职业分满了就换下一个
postFlag++;
}
//输出
sort(user,user + n,cmp2);//重新按乐斗排序
for(int i = 0 ; i < n ; i++)
display(user[i]);
return 0;
}