日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息奥赛一本通(1325:【例7.4】 循环比赛日程表)

發布時間:2025/3/17 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息奥赛一本通(1325:【例7.4】 循环比赛日程表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1325:【例7.4】 循環比賽日程表


時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 6257 ??? 通過數: 3483

【題目描述】

設有N個選手進行循環比賽,其中N=2^M,要求每名選手要與其他N?1名選手都賽一次,每名選手每天比賽一次,循環賽共進行N?1天,要求每天沒有選手輪空。

【輸入】

輸入:M。

【輸出】

輸出:表格形式的比賽安排表。一行各數據間用一個空格隔開。

【輸入樣例】

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

【問題分析】

? ? ? ? 以m=3(即 n=2^3=8)為例,可以根據問題要求,制定出如下表所示的一種方案∶

? ? ? ? 以表格的中心為拆分點,將表格分成 A、B、C、D 四個部分,就很容易看出有 A=D,B= C,并且這一規律同樣適用于各個更小的部分。

? ? ? ? 設有n個選手的循環比賽,其中 n=2^m,要求每名選手要與其他n-1名選手都賽一次。每名選手每天比賽一次,循環賽共進行 n-1天。要求每天沒有選手輪空,以下是八名選手時的循環比賽表,表中第一行為八位選手的編號,下面七行依次是每位選手每天的對手。

【算法分析】

? ? ? ? 從八位選手的循環比賽表中可以看出,這是一個具有對稱性的方陣,可以把方陣一分為四來看,那么左上角的 4×4 的方陣就是前四位選手的循環比賽表,而右上角的 4*4 的方陣就是后四位選手的循環比賽表,它們在本質上是一樣的,都是4 個選手的循環比賽表,所不同的只是選手編號不同而已,將左上角中方陣的所有元素加上 4 就能得到右上角的方陣。下方的兩個方陣表示前四位選手和后四位選手進行交義循環比賽的情況,同樣具有對稱性,將右上角方陣復制到左下角即得到1、2、3、4 四位選手和 5、6、7、8 四位選手的循環比賽表,根據對稱性,右下角的方陣應與左上角的方陣相同。這樣,八名選手的循環比賽表可以由四名選手的循環比賽表根據對稱性生成出來.同樣地,四名選手的循環比賽表可以由二名選手的循環比賽表根據對稱性生成出來,而兩名選手的循環比賽表可以說是已知的,這種程序設計方法叫做分治法,其基本思想是把一個規模為 n 的問題分成若干個規模較小的問題,使得從這些較小問題的解易于構造出整個問題的解。

程序中用數組 matchlist 記錄 n 名選手的循環比賽表,整個循環比賽表從最初的 1*1的方陣按上述規則生成出2*2 的方陣,再生成出 4*4 的方陣,…,直到生成出整個循環比賽表為止。變量half表示當前方陣的大小,也是要生成的下—個方陣的大小的一半。

【參考代碼】

#include<stdio.h> #define MAXN 1025int matchlist[MAXN][MAXN]; int m;int main() {int i,j,n,k=1,half=1;scanf("%d",&m);// 1<<m 相當手2^mn=1<<m;matchlist[0][0]=1;while(k<=m) //構造右上方方陣{for(i=0;i<half;i++)for(j=0;j<half;j++)matchlist[i][j+half]=matchlist[i][j]+half;for(i=0;i<half;i++) //對稱交換構造下半部分方陣for(j=0;j<half;j++){matchlist[i+half][j]=matchlist[i][j+half]; //左下方方降等于右上方方陣matchlist[i+half][j+half]=matchlist[i][j]; //右下方方降等于左上方方陣}half*=2;k++;} for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",matchlist[i][j]);printf("\n");}return 0; }

http://ybt.ssoier.cn:8088/problem_show.php?pid=1325

總結

以上是生活随笔為你收集整理的信息奥赛一本通(1325:【例7.4】 循环比赛日程表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。