二刷的时候发现更新了一些新的题目,尝试写了写后,发现我完全不会ACM输入输出模式。
这两天在补前几天没背的八股,写得不够满意(几乎是完全誊代码了),先放着,后面再补充补充吧。
1.题目:44. 开发商购买土地
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main () {
int n, m;
cin >> n >> m;
int sum = 0;
vector<vector<int>> vec(n, vector<int>(m, 0)) ;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> vec[i][j];
sum += vec[i][j];
}
}
// 统计横向
vector<int> horizontal(n, 0);
for (int i = 0; i < n; i++) {
for (int j = 0 ; j < m; j++) {
horizontal[i] += vec[i][j];
}
}
// 统计纵向
vector<int> vertical(m , 0);
for (int j = 0; j < m; j++) {
for (int i = 0 ; i < n; i++) {
vertical[j] += vec[i][j];
}
}
int result = INT_MAX;
int horizontalCut = 0;
for (int i = 0 ; i < n; i++) {
horizontalCut += horizontal[i];
result = min(result, abs(sum - horizontalCut - horizontalCut));
}
int verticalCut = 0;
for (int j = 0; j < m; j++) {
verticalCut += vertical[j];
result = min(result, abs(sum - verticalCut - verticalCut));
}
cout << result << endl;
}
2.题目:58.区间和
1.解法1:暴力解法
超时
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, a, b;
cin >> n;
vector<int>nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
while (cin >> a >> b) {
int sum = 0;
for (int i = a; i <= b; i++) {
sum += nums[i];
}
cout << sum << endl;
}
}
2.解法2:前缀和
前缀和的思想是重复利用计算过的子数组之和,从而降低区间查询需要累加计算的次数。
前缀和 在涉及计算区间和的问题时非常有用!
例如,我们要统计 vec[i] 这个数组上的区间和。
我们先做累加,即 p[i] 表示 下标 0 到 i 的 vec[i] 累加 之和。
如图:
在vec数组上 下标 2 到下标 5 之间的累加和,用p[5] - p[1]即可。
p[5] - p[1] 就是 红色部分的区间和。
而 p 数组是我们之前就计算好的累加和,所以后面每次求区间和的之后 我们只需要 O(1) 的操作。
特别注意: 在使用前缀和求解的时候,要特别注意 求解区间。
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, a, b;
cin >> n;
vector<int>nums(n);
vector<int>sum(n);
int presum = 0;
for (int i = 0; i < n; i++) {
cin >> nums[i];
presum += nums[i];
sum[i] = presum;
}
while (cin >> a >> b) {
int ans;
if (a == 0) ans = sum[b];
else ans = sum[b] - sum[a - 1];
cout << ans << endl;
}
}
C++ 代码 面对大量数据 读取 输出操作,最好用scanf 和 printf,耗时会小很多:
#include<iostream>
#include<vector>
using namespace std;
int main() {
int n, a, b;
cin >> n;
vector<int>nums(n);
vector<int>sum(n);
int presum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
presum += nums[i];
sum[i] = presum;
}
while (~scanf("%d%d", &a, &b)) {
int ans;
if (a == 0) ans = sum[b];
else ans = sum[b] - sum[a - 1];
printf("%d\n", ans);
}
}
标签:前缀,int,sum,随想录,cin,++,vec,数组,include
From: https://www.cnblogs.com/Henfiu/p/18361839