7月17日ブラシタイトルのレコードが分割して!サイクルレースのスケジュールを取得征服します

で:1┭┮﹏┭┮

qdoj.xyz 1053パーティション - サイクルレーススケジュール

 

 

 

実際には、今夜は、プログラミングのために残って多くの時間ではありません、します。

しかし、収穫は非常に大きいです

結局、私はあまりにも多くを学ぶことなく、アルゴリズムを征服、今日でも、除算の最初の行をキャプチャし、私の人生で、アルゴリズムの問​​題を征服ん!

次のように内容は次のとおりです。

 

 そして、これはそれを行う方法を疑問視

プロンプト

スプリットテーブルの中心点、テーブルに分割されているA B C D が存在することを確認することは容易であり、4つの部分A = Dは、B、= Cは、と、このルールは、それぞれのより小さい部分にも同様に適用。  

そして、これは友人のパーティションです

ある程度の知識を説明するために、


ことで、上記の表情に注意してください「分割統治適用条件を。」

/*
1053: B05-分治-循环比赛日程表(分治算法)
时间限制: 1 Sec  内存限制: 128 MB
提交: 17  解决: 9
[提交] [状态] [讨论版] [命题人:外部导入]
题目描述
设有n个选手进行循环比赛,其中n = 2m,要求每名选手要与其他n - 1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n - 1天,要求每天没有选手轮空。

输入
一行,包含一个正整数m。

输出
表格形式的比赛安排表(n行n列),每个选手的编号占三个字符宽度,右对齐。

样例输入

3


样例输出

  1  2  3  4  5  6  7  8
  2  1  4  3  6  5  8  7
  3  4  1  2  7  8  5  6
  4  3  2  1  8  7  6  5
  5  6  7  8  1  2  3  4
  6  5  8  7  2  1  4  3
  7  8  5  6  3  4  1  2
  8  7  6  5  4  3  2  1


提示

以表格的中心为拆分点,将表格分成A、B、C、D四个部分,就很容易看出有A=D,B=C,并且,这一规律同样适用于各个更小的部分。  

来源/分类
B05-分治 

[提交] [状态]
*/
#include<bits/stdc++.h>
using namespace std;
int ans[1001][1001];
int main(){
    int m;
    cin>>m;
    int n=1<<m;
    int h=1;
    ans[1][1]=1;
    for(int x=1;x<=m;x++)
    {
        for(int i=1;i<=h;i++)
            for(int j=1;j<=h;j++)
                ans[i][j+h]=ans[i][j]+h;//右上=左上+h
        for(int i=1;i<=h;i++)
            for(int j=1;j<=h;j++){
                ans[i+h][j+h]=ans[i][j];//右下=左上 
                ans[i+h][j]=ans[i][j+h]; //左下=右上 
            } 
        h*=2;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            printf("%3d",ans[i][j]);
        printf("\n");
    }
    return 0;
}

代码在此啦

可以辅助理解一下

p.s时间好像不够啦!886~只可意会不可言传

提高组加油!

 

 

おすすめ

転載: www.cnblogs.com/Tidoblogs/p/11204477.html