题目大意
有 n n n个队伍,两两之间要进行一场比赛,一共进行 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1)次比赛, a , b a,b a,b两队比赛的计分规则如下:
- 若两队伍平手输出 0 0 0,且两队均得一分。
 - 若 a a a胜利则输出 1 1 1, a a a得3分 b b b不得分。
 - 若 b b b胜利则输出 − 1 -1 −1, b b b得3分 a a a不得分。
 
给出一种构造方式使得所有队伍得分相同且平手的场次最少。
解题思路
首先通过打表若
    
     
      
       
        n
       
      
      
       n
      
     
    n为奇数则直接
    
     
      
       
        1
       
       
        ,
       
       
        −
       
       
        1
       
      
      
       1,-1
      
     
    1,−1交替输出即可,否则最少的平手场次是确定的,即
    
     
      
       
        
         n
        
        
         2
        
       
      
      
       \frac{n}{2}
      
     
    2n场,然后可以发现有很多种构造方法,我们只需找到一种,这里的思路现场没写出来,实际上就是
    
     
      
       
        n
       
       
        ∗
       
       
        n
       
      
      
       n*n
      
     
    n∗n方阵的右上角部分凑够
    
     
      
       
        
         n
        
        
         2
        
       
      
      
       \frac{n}{2}
      
     
    2n个0,然后使得1和-1个数相同即可。
 
 后来知道这个思路后很快就写出来了,还是思维不够灵活。
#include <bits/stdc++.h>
using namespace std;
#define ENDL "\n"
int a[105][105];
int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t, n, k;
    cin >> t;
    while (t--) {
        cin >> n;
        if (n == 2) {
            cout << "0" << ENDL;
            continue;
        }
        int x = n * (n - 1) / 2;
        if (x % n == 0) {
            for (int i = 1; i <= x; i++) {
                if (i & 1) cout << "1 ";
                else cout << "-1 ";
            }
            cout << ENDL;
        } else {
            memset(a, -1, sizeof a);
            for (int i = 1; i <= n; i++) {
                if (i & 1) a[i][i + 1] = 0;
                else a[i][i + 1] = 1;
            }
            for (int i = n; i > 2; i -= 2) {
                int delta = i - 1;
                for (int j = 1; j + delta <= n; j++) {
                    a[j][j + delta] = 1;
                }
            }
            for (int i = 1; i <= n; i++) {
                for (int j = i + 1; j <= n; j++) {
                    cout << a[i][j] << " ";
                }
            }
            cout << ENDL;
        }
    }
    return 0;
}
                
                  
                  
                  
                  
                            
这篇博客探讨了一种确保所有队伍得分相同的比赛计分构造方法,特别是当队伍数量为奇数和平数时如何最小化平局次数。对于奇数个队伍,可以通过交替输出1和-1实现;而对于偶数个队伍,需要构造特定的矩阵来达到目标,确保1和-1的数量相等,同时平局场次最少。作者反思了自己在解决这个问题时思维的灵活性不足。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					1256
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            