题目描述 给定一个 nn 行 mm 列的数字矩阵,第 ii 行第 jj 列的数称为 a_{i,j}a i,j 。 扶苏可以释放任意多次魔法,每次施放魔法,矩阵里的每个数字都会被减去 11。 现在扶苏想知道,她至少需要释放几次魔法,才能让矩阵中存在至少 kk 个位置 (x, y)(x,y),满足 a_{x, y}a x,y 大于或等于它所在行和列的元素之和。 形式化地,你需要计算最小的魔法释放次数使得施放魔法后存在至少 kk 个位置 (x, y)(x,y),满足 a_{x, y} \geq \sum \limits _{i = 1}^n a_{i,y} + \sum \limits _{i = 1}^m a_{x,i}a x,y ≥ i=1 ∑ n a i,y + i=1 ∑ m a x,i 。 输入格式 第一行是三个整数,表示矩阵的行数 nn,列数 mm 和要求符合条件的位置个数 kk。 接下来 nn 行,每行 mm 个整数,第 ii 行的第 jj 个整数表示初始的 a_{i,j}a i,j 。 输出格式 输出一行一个整数表示答案。c++代码
时间: 2024-04-16 14:25:25 浏览: 198
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> matrix(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> matrix[i][j];
}
}
vector<int> rowSums(n);
vector<int> colSums(m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
rowSums[i] += matrix[i][j];
colSums[j] += matrix[i][j];
}
}
vector<int> values;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
values.push_back(rowSums[i] + colSums[j] - matrix[i][j]);
}
}
sort(values.begin(), values.end(), greater<int>());
int count = 0;
int sum = 0;
for (int i = 0; i < k; i++) {
sum += values[i];
count++;
}
cout << count << endl;
return 0;
}
阅读全文