题意
n支队伍,两两之间有一场比赛,胜利者+3分,平局都+1分,失败+0分,如何构造出每队的得分都相同且让平局的场次尽可能的小
解析
每个人输赢必须相同,因此考虑对半思考问题。
对于队伍数目为 n n n,分类讨论
如果是奇数的个数,那就非常好办了,取窗口大小为 [ n 2 ] [\frac{n}{2}] [2n]向后滑动,处在窗口的前一般部分是失败后一半是胜利
如果是偶数的话,可以让窗口中间的数字平局,前一半失败,后一半的队伍胜利。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
int n;
cin>>n;
if(n%2==0){
int mid=n/2;
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(j==i+mid){
cout<<0<<" ";
}
else if(j<i+mid){
cout<<1<<" ";
}
else{
cout<<-1<<" ";
}
}
}
}
else{
int v=n/2;
//前v个 1 超过V个-1 窗口大小
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(j-i<=v)cout<<1<<" ";
else cout<<-1<<" ";
}
}
}
puts("");
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}