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了吧。。

浙公网安备 33010602011771号