【ACM-ICPC】Nowcoder Summer Training Camp 6 TC Delete Edges

题意

n个点形成完全无向图,我们可以选择互相连边的三元组(x, y, z)并删去这个三角形的三条边,问一种选择方案,使去掉这些三角形的三边后整个图中剩余边数小于n

解法分析

先使x < y < z,对于每个(x, y),只能选择一个z。
需要构造一种选取方法,使选取的三角形符合规则且总数目大于\(\frac{n(n-3)}6\)
方法是使 x + y + z = n或者 x + y + z = 2n。
仔细想想,手推一下,这样的构造是没有二元重复的,然后计算一下个数是够的。
计算方法:每次固定x,然后(y, z)的穷举范围随着x增加减少三,范围除二求和就是选择个数。

代码

#include <iostream>
using namespace std;
int main()
{
    int n, ans;
    cin>>n;
    if (n % 3)
    {
        ans = (n * n - 3 * n + 2) / 6;
        cout << ans <<endl;
    }
    else 
    {
        ans = (n * n - 3 * n + 6) / 6;
        cout << ans << endl;
    }
    for (int i = 1; i <= n - 2; ++i)
        for (int j = i + 1; j <= n - 1; ++j)
        {
            int k = n - i - j;
            if (k > j && k <= n)
                cout << i << ' ' << j << ' ' << k << endl;
            k += n;
            if (k > j && k <= n)
                cout << i << ' ' << j << ' ' << k << endl;
        }
    return 0;
}

小结

构造挺难想的,而且证明比较复杂。。。不光是代码力不太够,数学功底也欠缺。

posted @ 2021-08-04 15:13  cacu  阅读(33)  评论(0编辑  收藏  举报