蓝桥杯 最大获利 模拟

问题描述
  Chakra是一位年轻有为的企业家,最近他在进军餐饮行业。他在各地开拓市场,共买下了N个饭店。在初期的市场调研中,他将一天划分为M个时间段,并且知道第i个饭店在第j个时间段内,会有Aij位服务员当值和Bij位客户光临。他还分析了不同饭店不同时间段客户的需求,得到第i个饭店在第j个时间段内,平均每位客户消费Cij元。为了创设品牌形象,Chakra决定每个饭店每天只选择一个时间段营业,每个服务员至多接待一位顾客(若顾客数多于服务员数,超过部分的顾客当天就无法在该店消费了)。
  企业家的目的终究还是获利。请你安排营业时间,并告诉Chakra每天消费总额最多为多少。
输入格式
  第一行两个整数,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
样例输出
16
数据规模和约定
  1 <= M,N <= 100
  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 }
原文地址:https://www.cnblogs.com/fx1998/p/12610818.html