洛谷 P1786 帮贡排序-普及-

P1786 帮贡排序

题目背景

帮派名号:星月家园

帮主尊号:Dragonfly Kang

帮派 ID:2685023

帮派等级:4

帮派人数:101/110

帮派技能:(?)

“星月家园”资料,欢迎各位豆友加入 _


在 absi2011 的帮派里,死号偏多。现在 absi2011 和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。

题目描述

目前帮派内共最多有:

  • 111 位帮主(BangZhu\texttt{BangZhu}BangZhu
  • 222 位副帮主(FuBangZhu\texttt{FuBangZhu}FuBangZhu
  • 222 位护法(HuFa\texttt{HuFa}HuFa
  • 444 位长老(ZhangLao\texttt{ZhangLao}ZhangLao
  • 777 位堂主(TangZhu\texttt{TangZhu}TangZhu
  • 252525 名精英(JingYing\texttt{JingYing}JingYing
  • 若干(数量不限)帮众(BangZhong\texttt{BangZhong}BangZhong

保证以上职位是从高到低排列的。

现在 absi2011 要对帮派内几乎所有人的职位全部调整一番。他发现这是个很难的事情。于是要求你帮他调整。

他给你每个人的以下数据:

  • 名字
  • 原来职位
  • 帮贡
  • 等级

他要按照以下关键字给帮派内的人(帮主、副帮主除外)按以下关键字排序:

  • 帮贡(从高到低)第一关键字
  • 在输入中出现的顺序(从前到后)第二关键字

然后更新这些人的职位:

  • 1∼21 \sim 212 名:护法
  • 3∼63 \sim 636 名:长老
  • 7∼137 \sim 13713 名:堂主
  • 14∼3814 \sim 381438 名:精英
  • 39∼(n−3)39 \sim (n-3)39(n3) 名:帮众

可是,乐斗的显示并不按帮贡排序而按职位和等级排序。

他要你按照以下关键字排序并求出最后乐斗显示的列表(在他调整过职位后):

  • 职位(从高到低)第一关键字
  • 等级(从高到低)第二关键字
  • 在输入中出现的顺序(从前到后)第三关键字

注意:absi2011 无权调整帮主、副帮主的职位,包括他自己的。

输入格式

第一行一个正整数 nnn,表示星月家园内帮友的人数。

下面 nnn 行每行两个字符串两个整数,表示每个人的名字、职位、帮贡、等级。

输出格式

一共输出 nnn 行,每行包括排序后乐斗显示的名字、职位、等级。

输入输出样例 #1

输入 #1

9
DrangonflyKang BangZhu 100000 66
RenZaiJiangHu FuBangZhu 80000 60
absi2011 FuBangZhu 90000 60
BingQiLingDeYanLei HuFa 89000 58
Lcey HuFa 30000 49
BangYou3 ZhangLao 1000 1
BangYou1 TangZhu 100 40
BangYou2 JingYing 40000 10
BangYou4 BangZhong 400 1

输出 #1

DrangonflyKang BangZhu 66
RenZaiJiangHu FuBangZhu 60
absi2011 FuBangZhu 60
BingQiLingDeYanLei HuFa 58
BangYou2 HuFa 10
Lcey ZhangLao 49
BangYou1 ZhangLao 40
BangYou3 ZhangLao 1
BangYou4 ZhangLao 1

说明/提示

对于 10%10\%10% 的数据,保证 n=3n=3n=3

对于 40%40\%40% 的数据,保证各个人的帮贡均为 000

对于 100%100\%100% 的数据,保证:

  • 3≤n≤1103\leq n\leq 1103n110
  • 1≤1\leq1 名字长度 ≤30\leq3030
  • 所有名字两两不同
  • 名字只包含 ASCII 可见字符
  • 0≤0\leq0 各个人的帮贡 ≤109\leq10^9109
  • 1≤1\leq1 各个人等级 ≤150\leq 150150
  • 职位必定为以下七个中的一个:
    • BangZhu\texttt{BangZhu}BangZhu
    • FuBangZhu\texttt{FuBangZhu}FuBangZhu
    • HuFa\texttt{HuFa}HuFa
    • ZhangLao\texttt{ZhangLao}ZhangLao
    • TangZhu\texttt{TangZhu}TangZhu
    • JingYing\texttt{JingYing}JingYing
    • BangZhong\texttt{BangZhong}BangZhong
  • 初始时帮派内最多有:
    • 111 位帮主
    • 222 位副帮主
    • 222 位护法
    • 444 位长老
    • 777 位堂主
    • 252525 名精英
  • 恰好有一名帮主
  • 恰好有两名副帮主
  • 恰好有一名副帮主叫 absi2011

【题目来源】

fight.pet.qq.com

absi2011 授权题目

solution

代码

#include <sstream>
#include "iostream"
#include "math.h"
#include "algorithm"
#include "string.h"
#include "unordered_set"
#include "deque"
#include "stack"
#include "queue"
#include "vector"
#include "unordered_map"

using namespace std;

const int N = 1e2 + 20;

int M = 1e9 + 10;

struct P {
    string name;
    int bg, lvl, id;
};

bool comp(P a, P b) {
    return a.bg > b.bg || a.bg == b.bg && a.id < b.id;
}

bool comp2(P a, P b) {
    return a.lvl > b.lvl || a.lvl == b.lvl && a.id < b.id;
}

P p[N];

int main() {
    int n;
    string job;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> p[i].name >> job >> p[i].bg >> p[i].lvl;
        p[i].id  = i;
        if (job == "BangZhu") p[i].bg = M + 10;
        if (job == "FuBangZhu") p[i].bg = M;
    }

    sort(p, p + n, comp);

    if (n < 3) {
        sort(p + 1, p + n, comp2);
    } else {
        sort(p + 1, p + 3, comp2);
        if (n < 5) {
            sort(p + 3, p + n, comp2);
        } else {
            sort(p + 3, p + 5, comp2);
            if (n < 9) {
                sort(p + 5, p + n, comp2);
            } else {
                sort(p + 5, p + 9, comp2);
                if (n < 16) {
                    sort(p + 9, p + n, comp2);
                } else {
                    sort(p + 9, p + 16, comp2);
                    if (n < 41) {
                        sort(p + 16, p + n, comp2);
                    } else {
                        sort(p + 16, p + 41, comp2);
                        sort(p + 41, p + n, comp2);
                    }
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        if (i == 0) cout << p[i].name << ' ' << "BangZhu " << p[i].lvl << endl;
        else if (i < 3) cout << p[i].name << ' ' << "FuBangZhu " << p[i].lvl << endl;
        else if (i < 5) cout << p[i].name << ' ' << "HuFa " << p[i].lvl << endl;
        else if (i < 9) cout << p[i].name << ' ' << "ZhangLao " << p[i].lvl << endl;
        else if (i < 16) cout << p[i].name << ' ' << "TangZhu " << p[i].lvl << endl;
        else if (i < 41) cout << p[i].name << ' ' << "JingYing " << p[i].lvl << endl;
        else cout << p[i].name << ' ' << "BangZhong " << p[i].lvl << endl;
    }

    return 0;
}

结果

在这里插入图片描述

### P9496 「RiOI-2」hacker 题解与代码实现 在 P9496 「RiOI-2」hacker 的题目中,问题的核心在于处理字符串的匹配与判断。根据已知的引用内容[^1],可以推断出该题可能涉及对特定字符串模式的查找和验证。 #### 问题分析 此题需要判断给定的两个字符串是否满足某种条件,具体条件为:其中一个字符串或两个字符串都包含子串 "rioi"(不区分大小写)。若两个字符串均符合条件,则输出 "Either is ok!";若仅一个字符串符合条件,则输出对应字符串及 "for sure!";若两者均不符合条件,则输出 "Try again!"。 #### 解题思路 通过将字符串转换为小写形式后进行子串查找,可以有效解决大小写敏感的问题。以下是实现这一逻辑的具体步骤: 1. 定义一个辅助函数 `is_good`,用于判断字符串是否包含子串 "rioi"。 2. 在主函数中读取输入的两个字符串,并调用辅助函数分别检查两者的条件。 3. 根据检查结果输出对应的答案。 #### 代码实现 以下为 C++ 实现代码: ```cpp #include <bits/stdc++.h> using namespace std; bool is_good(string str) { string lower_str = str; transform(lower_str.begin(), lower_str.end(), lower_str.begin(), ::tolower); // 将字符串转换为小写 return lower_str.find("rioi") != string::npos; // 检查小写字符串中是否包含 "rioi" } int main() { string s, t; cin >> s >> t; // 检查两个字符串是否都是好闪的 if (is_good(s) && is_good(t)) { cout << "Either is ok!" << endl; } // 检查第一个字符串是否是好闪的 else if (is_good(s)) { cout << s << " for sure!" << endl; } // 检查第二个字符串是否是好闪的 else if (is_good(t)) { cout << t << " for sure!" << endl; } // 如果两个字符串都不是好闪的 else { cout << "Try again!" << endl; } return 0; } ``` #### 复杂度分析 - **时间复杂度**:O(n + m),其中 n 和 m 分别为两个字符串的长度。字符串转换为小写的时间复杂度为 O(n + m),子串查找的时间复杂度同样为 O(n + m)[^2]。 - **空间复杂度**:O(n + m),主要由辅助字符串 `lower_str` 占用。 ### 注意事项 对于某些评测机可能存在不稳定的情况,建议多次提交以确保结果的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智趣代码实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值