zoukankan      html  css  js  c++  java
  • 『题解』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;
    }
    
  • 相关阅读:
    Codeforces Round #274 (Div. 2)
    codeforces 477C
    ZOJ 3822 Domination
    Codeforces Round #271 (Div. 2)
    进程
    线程
    udp和tcp特点 实现文件上传
    面向对象补1
    socket基本语法和粘包
    网络编程
  • 原文地址:https://www.cnblogs.com/Frather/p/14586072.html
Copyright © 2011-2022 走看看