扯淡
其实这题真的没啥。。。
毕竟题面是窝翻译的,不把这题做了都不好意思了~
思路
真的很水
直接枚举即可。
寻找队长,如果是 \(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;
}