可以使用stable_sort吗-C++
  • 板块P1786 帮贡排序
  • 楼主IL_2
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/20 11:15
  • 上次更新2023/10/24 03:32:31
查看原帖
可以使用stable_sort吗-C++
333724
IL_2楼主2023/1/20 11:15

这是使用std::stable_sort的代码

#include <bits/stdc++.h>
using namespace std;

struct player
{
    string name;
    int type, level;
    long long bg;
};

int n;
string mp[7] = {
    "BangZhu", "FuBangZhu", "HuFa", "ZhangLao",
    "TangZhu", "JingYing", "BangZhong"
};
player players[111];

int n_mp(string a)
{
    for (int i=0; i<7; i++)
        if (mp[i]==a)
            return i;
}

bool cmp0(player a, player b)
{
    return a.bg>b.bg;
}

bool cmp1(player a, player b)
{
    return a.type!=b.type ? a.type<b.type : a.level>b.level;
}

int main()
{
    scanf("%d", &n);
    for (int i=0; i<n; i++)
    {
        cin >> players[i].name;
        string l;
        cin >> l;
        players[i].type = n_mp(l);
        scanf("%lld%d", &players[i].bg, &players[i].level);
    }

    stable_sort(players+3, players+n, cmp0);
    for (int i=3; i<n; i++)
    {
        if (i>2 && i<=4)
            players[i].type = 2;
        else if (i>4 && i<=8)
            players[i].type = 3;
        else if (i>8 && i<=15)
            players[i].type = 4;
        else if (i>15 && i<=40)
            players[i].type = 5;
        else players[i].type = 6;
    }

    stable_sort(players+3, players+n, cmp1);
    for (int i=0; i<n; i++)
    {
        cout << players[i].name << ' ';
        cout << mp[players[i].type] << ' ';
        printf("%d\n", players[i].level);
    }

    return 0;
}

#2,6,8,9 WA

这是使用std::sort的代码

只改动了bool cmp0()bool cmp1(),并在输入时记录输入顺序

#include <bits/stdc++.h>
using namespace std;

struct player
{
    string name;
    int type, level;
    long long bg;
    int n;
};

int n;
string mp[7] = {
    "BangZhu", "FuBangZhu", "HuFa", "ZhangLao",
    "TangZhu", "JingYing", "BangZhong"
};
player players[111];

int n_mp(string a)
{
    for (int i=0; i<7; i++)
        if (mp[i]==a)
            return i;
}

bool cmp0(player a, player b)
{
    return a.bg!=b.bg ? a.bg>b.bg : a.n<b.n;
}

bool cmp1(player a, player b)
{
    return a.type!=b.type ? a.type<b.type : (a.level!=b.level?a.level>b.level:a.n<b.n);
}

int main()
{
    scanf("%d", &n);
    for (int i=0; i<n; i++)
    {
        cin >> players[i].name;
        string l;
        cin >> l;
        players[i].type = n_mp(l);
        scanf("%lld%d", &players[i].bg, &players[i].level);
        players[i].n=i;
    }

    sort(players+3, players+n, cmp0);
    for (int i=3; i<n; i++)
    {
        if (i>2 && i<=4)
            players[i].type = 2;
        else if (i>4 && i<=8)
            players[i].type = 3;
        else if (i>8 && i<=15)
            players[i].type = 4;
        else if (i>15 && i<=40)
            players[i].type = 5;
        else players[i].type = 6;
    }

    sort(players+3, players+n, cmp1);
    for (int i=0; i<n; i++)
    {
        cout << players[i].name << ' ';
        cout << mp[players[i].type] << ' ';
        printf("%d\n", players[i].level);
    }

    return 0;
}

然而 AC 了。

这是为什么呢,求教!

2023/1/20 11:15
加载中...