The 2018 ACM-ICPC Asia Qingdao Regional Contest F - Tournament

题目链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/9182737031

题意:n个骑士 进行k轮决斗,每轮两个骑士为一组 下一轮更换对手 但上一轮一组的两人的对手上一轮也必须为一组。比如第一次a和b是对手,c和d是对手,那第二次如果a和c是对手,那a上一次的对手b必须和c上一次的对手d是对手。输出k行决斗的赛表 每行n个数字 第i个数代表i的对手 (按字典序升序输出)如果无法安排 输出Impossible

思路:规律是用异或的性质 0 1 2 3 分别异或 0 1 2 3得 0 1 2 3的四组不同排列,n个人最多可分配轮数k=n&(-n),即n的含2的因子 4=>4 6=>2 8=>8,因为每轮交换对手以两组为单位。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m,k;
        scanf("%d%d",&n,&m);
        if(m>=(n&(-n)))
        {
            printf("Impossible\n");
            continue;
        }
        for(int j=1; j<=m; j++)
        {
            for(int i=0; i<n-1; i++)
                printf("%d ",(i^j)+1);
            printf("%d\n",(j^(n-1))+1);
        }
    }
}




猜你喜欢

转载自www.cnblogs.com/zcb123456789/p/12336641.html