分治迭代经典——循环赛日程表问题(精简代码)

题目描述:

输入正整数k表示有n=2^k个运动员进行循环比赛,需要设计比赛日程表。每个选手与其他n-1个

选手各赛一次;每个选手一天只能赛一次;循环赛一共进行n-1天。

按此要求设计一张比赛日程表,该表有n行和n-1列,第i行第j列表示第i个选手第j天遇到的选手。

思路:

       不再赘述,只是想熟悉/优化一下代码。。。。。。

代码实现:(不考虑轮空问题)

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 2e5+100;

int arr[1024][1024];
int main(){
	//暂不考虑轮空问题 
	int n;
	while(scanf("%d",&n)!=EOF){
		arr[1][1]=1;
		arr[1][2]=2;
		arr[2][1]=2;
		arr[2][2]=1;
		//CCPC网赛自己写的代码太垃圾,又长思维性又差 
		for(int i=4;i<=n;i<<=1){
			for(int j=1;j<=i/2;j++){
				for(int k=1;k<=i/2;k++){
					arr[j+i/2][k+i/2]=arr[j][k];
					arr[j+i/2][k]=arr[j][k+i/2]=arr[j][k]+i/2;
				}
			}
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				printf("%d%c",arr[i][j]," \n"[j==n]);
	}
	return 0;
}

THE END;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值