题目链接: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 "); continue; } for(int j=1; j<=m; j++) { for(int i=0; i<n-1; i++) printf("%d ",(i^j)+1); printf("%d ",(j^(n-1))+1); } } }