题目是这样的
1、 设有n个球队要进行排球循环赛,设计一个满足以下要求的比赛日程表:
a) 每个球队必须与其他n-1个球队各赛一次;
b) 每个球队一天只能赛一次;
c) 当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。
n=6的比赛日程表示例(把6个队从1到6进行编号):
分析一下:
假设n为偶数,一共得比赛场次是(n*(n-1))/2 ,每天最多比赛 n/2场.所以一共需要比赛n-1天。
n为奇数时,可以补0,添加为偶数。 与0匹配的时表示轮空。
网上的思路:
思路是 1位置保持不动,其余几位逆时针旋转,一共旋转n-1次。这样可以保证,每天每人 比赛一次。且不重复。
---
1 4
2 5
3 6
---
1 5
4 6
2 3
---
1 6
5 3
4 2
---
1 3
6 2
5 4
----
1 2
3 4
6 5
C++实现如下:
#include<stdio.h> #include<string.h> #include <vector> using namespace std; int main() { std::vector<int>a; int n; scanf("%d",&n); for(int i = 0; i < n; i++) { a.push_back(i+1); } if(a.size() % 2) a.push_back(0); n = a.size(); int mid = n/2; int s1[35],s2[35]; if(n<=2) return 0; for(int i = 0; i < mid; i++) { s1[i] = a[i]; s2[i] = a[i+mid]; } for(int i = 0; i < n-1; i++) { printf("day =============%d\n\n",i+1); for(int j = 0; j < mid; j++) { printf("%d %d\n",s1[j],s2[j]); } int tmp = s1[1]; for(int j = 1;j < mid-1; j++) { s1[j] = s1[j+1]; } s1[mid-1] = s2[mid-1]; for(int j = mid-1;j >= 1; j--) { s2[j] = s2[j-1]; } s2[0] = tmp; } return 0; }
时间: 2024-10-01 08:01:29