输入案例结果是对的,为什么测试点全错,这个题好像还不能下载测试点
  • 板块P1786 帮贡排序
  • 楼主Qian_Me
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/23 10:59
  • 上次更新2024/11/23 13:17:17
查看原帖
输入案例结果是对的,为什么测试点全错,这个题好像还不能下载测试点
1542712
Qian_Me楼主2024/11/23 10:59
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

struct ddd{
    string name; // 姓名
    string old_jobs; // 输入的职位
    string new_jobs; // 排序后新的职位
    long long bg; // 帮贡
    int grade; // 等级
    int n; // 输入顺序
    int jobs_num; // 职位编号 




    // 职位编号规则:

    // 1 ~ 3:      帮主 / 副帮主
    // 4 ~ 5:      护法
    // 6 ~ 9:      长老
    // 10 ~ 16:    堂主
    // 17 ~ 42:    精英


};

// 第一次排序 - 单纯的按 “帮贡” 从大到小排序
int compare_1( ddd a, ddd b );

// 第二次排序 - 按 “现在的职位” 然后 按 “等级” 从小到大排序
int compare_2( ddd a, ddd b );

// 将 职位进行 【编码】 操作
void scan_jobs_num( ddd *data, int num );

// 打印帮贡的数据
void print_data( ddd *data, int num );

// 输入 新的职位
void scan_new_jobs( ddd *data, int num );

int main( void ){
    ddd data[ 120 ]; // 帮派最大人数为 110 人

    

    int num = 0;
    cin >> num;

    
    for( int i = 1; i <= num; i ++ ){
        cin >> data[ i ].name >> data[ i ].old_jobs >> data[ i ].bg >> data[ i ].grade;
        data[ i ].n = i;
    }

    // 第一次排序
    sort( data + 4, data + num + 1, compare_1 );
    
    // 对 【新的职位】 进行 【编码】 操作
    scan_new_jobs( data, num );

    // 第二次排序
    sort( data + 4, data + num + 1, compare_2 );

    scan_jobs_num( data, num ); // 将 职位进行 【编码】 操作
    // 一定要 经过两次排序以后 才可以进行  【编码】 操作,否则,输入【编码】以后,再排序,那么编码就会乱了

    // 打印帮贡的数据
    print_data( data, num );

    return 0;
}

// 第一次排序 - 单纯的按 “帮贡” 从大到小排序
int compare_1( ddd a, ddd b ){
    if( a.bg == b.bg ) // 如果帮贡相同则按照 输入顺序排序
        return a.n < b.n; // n 小的在前(谁先输入的在前面)
    else
        return a.bg > b.bg; // 帮贡大的在前
}

// 第二次排序 - 按 “现在的职位” 然后 按 “等级” 从小到大排序
int compare_2( ddd a, ddd b ){
    if( a.new_jobs == b.new_jobs ){ // 如果现在的职位【相同】则按照 等级 从小到大排序
        if ( a.grade == b.grade ) // 若【等级】也相等,则按照序号
            return a.n < b.n; // n 小的在前(谁先输入的在前面
        else
            return a.grade > b.grade; // 等级【大】的在前 --> 千万注意:等级越大越牛逼,不是等级越小越牛逼
    }

    else // 若职位【不相同】按照 现在的职位 从小到大排序
        return a.jobs_num < b.jobs_num; // 职位编号小的在前
}

// 将 职位进行 【编码】 操作 -- 这一步是为了  通过 职位比较进行排序算法操作
void scan_jobs_num( ddd *data, int num ){


    // 职位编号规则:


    // 1 ~ 3:      帮主 / 副帮主
    // 4 ~ 5:      护法
    // 6 ~ 9:      长老 
    // 10 ~ 16:    堂主  
    // 17 ~ 42:    精英

    for( int i = 1; i <= num; i ++ ){
        if( i >= 1 && i <= 3 )    data[ i ].jobs_num = 1;
        else if( i >= 4 && i <= 5 )   data[ i ].jobs_num = 2;
        else if( i >= 6 && i <= 9 )     data[ i ].jobs_num = 3;
        else if( i >= 10 && i <= 16 )    data[ i ].jobs_num = 4;
        else if( i >= 17 && i <= 42 )    data[ i ].jobs_num = 5;
        else    data[ i ].jobs_num = 6;
    }
}

// 打印帮贡的数据
void print_data( ddd *data, int num ){
    for( int i = 1; i <= num; i ++ ){
        //  打印每一条的数据
        cout << data[ i ].name << " " << data[ i ].new_jobs << " " << data[ i ].grade << endl;
    }
}

// 输入 新的职位
void scan_new_jobs( ddd *data, int num ){
    for( int i = 1; i <= num; i ++ ){
        if( i == 1 )        data[ i ].new_jobs = "BangZhu";
        else if( i >= 2 && i <= 3 )      data[ i ].new_jobs = "FubangZhu";
        else if( i >= 4 && i <= 5 )      data[ i ].new_jobs = "HuFa";
        else if( i >= 6 && i <= 9 )      data[ i ].new_jobs = "ZhangLao";
        else if( i >= 10 && i <= 16 )    data[ i ].new_jobs = "TangZhu";
        else if( i >= 17 && i <= 42 )    data[ i ].new_jobs = "JingYing";
        else    data[ i ].new_jobs = "BangZhong";
    }
}
2024/11/23 10:59
加载中...