Tsinghua OJ 工作分配(Workload)C++ 数组指针实现
本地测试都AC,三个测试,最后回车,和别人的AC100/100一样
除非要求:必须递归,或者要求不能在代码里delete删除数组行。
我认为没有问题。如果用vector更简单。
#include <iostream>
using namespace std;namespace my_find_min2{int getMin(int **mat1, const int col,int &n,int m){int min = 0,v1=0;int row = 0;min = mat1[0][col];row = 0;for (int j = 0; j < n; j++){v1 = mat1[j][col];if (v1>0){if (min > mat1[j][col]){min = mat1[j][col];row = j;}}}delete[] mat1[row];n--; for (int i = row; i < n; ++i) {mat1[i] = mat1[i + 1];}mat1[n] = nullptr;//show/*for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){cout << mat1[i][j] << " ";}cout << endl;}*/return min;}int get_col_min(int **mat1,int n){int min = 0, v1 = 0, col = 0;int sum = 0;int total = n;int len = n;while (total > 0){min = getMin(mat1, col, len,n);sum += min;total--;col++; }return sum;}
}
using namespace my_find_min2;int main()
{int v1 = 0;int n = 0;cin >> n;int total = 10000;if (n > 15 || n<1){return 0;}int all_values = 0;int **mat1;mat1 = new int*[n];for (int i = 0; i < n; i++){mat1[i] = new int[n];for (int j = 0; j < n; j++){cin >> v1;all_values += v1;mat1[i][j] = v1;}}if (all_values > total){return 0;}int sum = 0;sum = get_col_min(mat1,n);cout<<sum<<endl; return 0;
}/*题意:查找每列的最小值,然后求和,但是不能重复去同一行取最小值。(需要将已经得到最小值的行移除,再继续)
简言之,就是每个人的工作,已经分配了,就不能再让此人再去干其他任务。例如:
10 2 3
2 3 4
3 4 5
每一行表示一个人,后面是他干每个任务的时间,每一列相当一个任务。2+2+5(1行和2行已经分配)程序思路:
循环每一列,查找最小值,找到,立刻把此员工的所在移除(二维数组需要将后面移动到当前1位),
因为其已经分配好工作任务了。测试案例在本文结尾出。
2025-09-28 耗费几个小时完成。测试案例
Sample input:
3
4 2 5
2 3 6
3 4 5
output:
95
9 2 9 1 9
1 9 8 9 6
9 9 9 9 1
8 8 1 8 4
9 1 7 8 9
output:
56
10 11 12 11 9 11
11 9 10 13 11 12
12 10 11 10 13 9
9 14 9 10 10 11
10 10 9 11 12 11
10 7 10 10 10 8
output:
56*/
用简单的方法解决,不用递归!!!实际上工作,也很少用递归!