洛谷P1786 帮贡排序 暴力模拟

题目链接

给帮派打广告都打到算法网站了.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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值