The Trail

https://codeforces.com/problemset/problem/2055/C

题意:给定一个n * m的矩阵,矩阵中每一行跟每一列的和都应该是相等的,但是目前从左上角到右下角的路径上的数字都变成了0,需要填充这个路径上的数字,使得满足初始条件。

思路:每行跟每列的和都相等,假设和是S,那么n * s = 矩阵he = m * s,即n * s = m * s,即n = m,要满足这个不等式,只有当输入n = m时才合法,或者s=0时合法,为了保证n != m时有解,令S = 0。随后,我们从左上角出发往右下角走,如果当前要往下走,就求出这一行的和sum,然后当前位置应为-sum;如果往右走,那就求这一列的和sum,然后将当前位置设为-sum。最后,单独考虑最后一行的和,将右下角设置为该和的负数即可。

总结:完全没思路,看了题解才想到要先建立这个等式的关系。 每行跟每列的和都相等,那就先假设出有一个这样的和,看看能推出什么来,然后再想办法让和都等于0,这一步也很巧妙,一开始还在想有的是行走了两步,有的是列走了两步,怎么考虑?不管是往右走还是往下走,在走之前,当前位置所在的行或者列永远不会再回来了,所以先把他设定好就行了。

inline void solve() {
    int n, m;
    cin >> n >> m;

    string s;
    cin >> s;

    vector<vector<long long>> a(n, vector<long long>(m, 0));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
        }
    }

    int x = 0, y = 0;
    for (const auto& c : s) {
        if (c == 'D') {
            long long sum = std::accumulate(a[x].begin(), a[x].end(), 0ll);
            a[x][y] = -sum;
            x ++;
        }
        else {
            long long sum = 0;
            for (int i = 0; i < n; ++i) {
                sum += a[i][y];
            }
            a[x][y] = -sum;
            y ++;
        }
    }

    {
        long long sum = std::accumulate(a[n - 1].begin(), a[n - 1].end(), 0ll);
        a[n - 1][m - 1] = -sum;
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cout << a[i][j] << " \n"[j == m - 1];
        }
    }

}

cf系统崩了,没提交代码,但是应该是ac了吧。。

posted @ 2025-07-10 10:25  _Yxc  阅读(6)  评论(0)    收藏  举报