问题描述
Chakra是一位年轻有为的企业家,最近他在进军餐饮行业。他在各地开拓市场,共买下了N个饭店。在初期的市场调研中,他将一天划分为M个时间段,并且知道第i个饭店在第j个时间段内,会有Aij位服务员当值和Bij位客户光临。他还分析了不同饭店不同时间段客户的需求,得到第i个饭店在第j个时间段内,平均每位客户消费Cij元。为了创设品牌形象,Chakra决定每个饭店每天只选择一个时间段营业,每个服务员至多接待一位顾客(若顾客数多于服务员数,超过部分的顾客当天就无法在该店消费了)。
企业家的目的终究还是获利。请你安排营业时间,并告诉Chakra每天消费总额最多为多少。
企业家的目的终究还是获利。请你安排营业时间,并告诉Chakra每天消费总额最多为多少。
输入格式
第一行两个整数,N、M。
第二行开始依次给出三个矩阵A(N*M)、B(N*M)、C(N*M)。
第二行开始依次给出三个矩阵A(N*M)、B(N*M)、C(N*M)。
输出格式
一行一个整数,最大消费总额。
样例输入
2 3
1 2 3
3 2 1
3 2 1
1 2 3
4 5 2
3 1 6
1 2 3
3 2 1
3 2 1
1 2 3
4 5 2
3 1 6
样例输出
16
数据规模和约定
1 <= M,N <= 100
1 <= Aij, Bij <= 5000
0 <= Cij <= 10^9
1 <= Aij, Bij <= 5000
0 <= Cij <= 10^9
解题思路:读懂题意就很容易了,数据范围最大值为100*5000*10^9 = 5 * 10^14,用 long long 存储。
普通做法:
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long a[105][105], b[105][105], c[105][105]; 4 int main() { 5 int n, m; 6 cin >> n >> m; 7 //a数组输入服务员信息 8 for (int i = 0; i < n; i++) { 9 for (int j = 0; j < m; j++) { 10 cin >> a[i][j]; 11 } 12 } 13 //b数组输入顾客信息 14 for (int i = 0; i < n; i++) { 15 for (int j = 0; j < m; j++) { 16 cin >> b[i][j]; 17 } 18 } 19 //c数组输入顾客营业额信息 20 for (int i = 0; i < n; i++) { 21 for (int j = 0; j < m; j++) { 22 cin >> c[i][j]; 23 } 24 } 25 //对于a数组和b数组,每一位上取营业员数和顾客数量的最小值,作为成功提供营业的数量 26 /* 27 样例分析:a数组为: 1 2 3 28 3 2 1 29 b数组为: 3 2 1 30 1 2 3 31 每一位上取营业员数和顾客数量的最小值 32 所以成功提供营业的数量数组d: 33 d数组为: 1 2 1 34 1 2 1 35 c数组为: 4 5 2 36 3 1 6 37 把d数组依次乘以c数组得出答案营业额数组e : 38 e数组为 :4 10 2 39 3 2 6 40 分析e数组,样例是2个饭店,3个时间段 41 第一个饭店在第一个时间段的营业额是4 42 第一个饭店在第二个时间段的营业额是10 43 第一个饭店在第三个时间段的营业额是2 44 第二个饭店在第一个时间段的营业额是3 45 第二个饭店在第二个时间段的营业额是2 46 第二个饭店在第三个时间段的营业额是6 47 所以最终答案为10+6=16 48 */ 49 for (int i = 0; i < n; i++) { //在a数组和b数组每一位中选出最小值乘以c数组 50 for (int j = 0; j < m; j++) { 51 if (a[i][j] > b[i][j]) { 52 c[i][j] *= b[i][j]; 53 } else { 54 c[i][j] *= a[i][j]; 55 } 56 } 57 } //现在c数组的值即为营业额数组,数值同上面e数组 58 /*for (int i = 0; i < n; i++) { 59 for (int j = 0; j < m; j++) { 60 cout << c[i][j] << " "; 61 } 62 cout << endl; 63 }*/ 64 for (int i = 0; i < n; i++) { //对二维数组每一行进行冒泡排序 65 for (int k = 0; k < m; k++) { 66 for (int j = 0; j < m - k - 1; j++) { 67 if (c[i][j] > c[i][j + 1]) { 68 swap(c[i][j], c[i][j + 1]); 69 } 70 } 71 } 72 } 73 /*for (int i = 0; i < n; i++) { 74 for (int j = 0; j < m; j++) { 75 cout << c[i][j] << " "; 76 } 77 cout << endl; 78 }*/ 79 //排序后,现在c数组内的值为:2 4 10 80 // 2 3 6 81 long long ans = 0; 82 for(int i = 0; i < n; i++) { 83 ans += c[i][m - 1]; //加10,加6 84 } 85 cout << ans << endl; 86 return 0; 87 }
也可以只开一个数组:
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long a[105][105]; 4 int main() { 5 int n, m; 6 cin >> n >> m; 7 for (int i = 0; i < n; i++) { 8 for (int j = 0; j < m; j++) { 9 cin >> a[i][j]; 10 } 11 } 12 long long t; 13 for (int i = 0; i < n; i++) { 14 for (int j = 0; j < m; j++) { 15 cin >> t; 16 a[i][j] = min(a[i][j], t); 17 } 18 } 19 for (int i = 0; i < n; i++) { 20 for (int j = 0; j < m; j++) { 21 cin >> t; 22 a[i][j] *= t; 23 } 24 } 25 for (int i = 0; i < n; i++) { 26 for (int k = 0; k < m; k++) { 27 for (int j = 0; j < m - k - 1; j++) { 28 if (a[i][j] > a[i][j + 1]) { 29 swap(a[i][j], a[i][j + 1]); 30 } 31 } 32 } 33 } 34 long long ans = 0; 35 for(int i = 0; i < n; i++) { 36 ans += a[i][m - 1]; 37 } 38 cout << ans << endl; 39 return 0; 40 }
顺便复习下冒泡排序:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int a[10]; 4 int main() { 5 int n; 6 cin >> n; 7 for (int i = 0; i < n; i++) { 8 cin >> a[i]; 9 } 10 for (int i = 0; i < n; i++) { 11 for (int j = 0; j < n - i - 1; j++) { 12 if (a[j] > a[j + 1]) { 13 swap(a[j], a[j + 1]); 14 } 15 } 16 } 17 for (int i = 0; i < n; i++) { 18 cout << a[i] << " "; 19 } 20 return 0; 21 }