『题解』CF59D Team Arrangement

扯淡

其实这题真的没啥。。。

毕竟题面是窝翻译的,不把这题做了都不好意思了~

思路

真的很水

直接枚举即可。

寻找队长,如果是 \(k\), 那就为其找队员;如果不是 \(k\), 那就顺序输出 \(1-n\)

更多解析已经写在代码里了。

话说越简单的题出错率越高正常么。。。

踩坑记录:

由于变量名写错写重及某些原因的神笔错误

CODE

/*

代码存在明显错误~

Name: CF59D Team Arrangement

Solution: 瞎搞

By Frather_

*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#define InF 0x3f3f3f3f
#define kMax 10e5
#define kMin -10e5
#define kMod 998244353
using namespace std;
/*===================================================快读*/
//手动放抄袭
/*===============================================定义变量*/
int n;

const int _ = 1000010;

int t[_];
queue<int> q;//利用 队列 记录当前剩余的学生的得分

struct team
{
    int fir;
    int sec;
    int tir;
} tm[_];//记录每个团队的三位成员
int head[_];

int k;

int sum;
int flag[_],flag_[_];
int num;
/*=============================================自定义函数*/

/*=================================================主函数*/
int main()
{
    n = read();
    for (int i = 1; i <= n * 3; i++)
    {
        t[i] = read();
        q.push(t[i]);//将当前同学的得分添加进队列
    }
    for (int i = 1; i <= n; i++)//存储给定团队的成员
    {
        tm[i].fir = read();
        tm[i].sec = read();
        tm[i].tir = read();
    }

    k = read();
    for (int i = 1; i <= n; i++)
    {
        if (q.front() == k)//当前得分的同学是第 k 位同学
        {
            sum = i;//记录编号
            break;
        }
        q.pop();
        flag[tm[i].sec] = 1;
        flag[tm[i].tir] = 1;

        if (!q.empty())
            while (flag[q.front()] == 1)
            {
                q.pop();
                if (q.empty())
                    break;
            }
    }


    if (sum == 0)//如果 k 不是队长,顺序输出 1 ~ n
    {
        for (int i = 1; i <= n * 3; i++)
            if (i != k)
                printf("%d ", i);
        puts("");
        return 0;
    }
    //如果 k 是队长
    for (int i = 1; i <= sum; i++)//为k寻找队员
    {
        flag_[tm[i].fir]++;
        flag_[tm[i].sec]++;
        flag_[tm[i].tir]++;
    }
    if (tm[sum].fir != k && tm[sum].fir > num)
        num = tm[sum].fir;
    if (tm[sum].sec != k && tm[sum].sec > num)
        num = tm[sum].sec;
    if (tm[sum].tir != k && tm[sum].tir > num)
        num = tm[sum].tir;

    for (int i = 1; i <= num; i++)//按字典序顺序输出除第 k 个学生外的最小排列
        if (flag_[i] && i != k)
        {
            flag_[i] = 2;
            printf("%d ", i);
        }
    for (int i = 1; i <= n * 3; i++)
        if (flag_[i] != 2 && i != k)
            printf("%d ", i);
    puts("");

    return 0;
}
原文地址:https://www.cnblogs.com/Frather/p/14586072.html