Educational Codeforces Round 104 (Rated for Div. 2) C. Minimum Ties(思维+构造)

这篇博客探讨了一种确保所有队伍得分相同的比赛计分构造方法,特别是当队伍数量为奇数和平数时如何最小化平局次数。对于奇数个队伍,可以通过交替输出1和-1实现;而对于偶数个队伍,需要构造特定的矩阵来达到目标,确保1和-1的数量相等,同时平局场次最少。作者反思了自己在解决这个问题时思维的灵活性不足。

传送门


题目大意

n n n个队伍,两两之间要进行一场比赛,一共进行 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)次比赛, 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 nn方阵的右上角部分凑够 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值