C++实现只能使用iostream及cmath今天小Q班的体育课是进行拔河比赛。同学们个个兴奋极了。体育老师- -声令下就抢着拉绳子与好了位置谁也不肯让谁。每位同学都一个力量值为了让两边队伍实力均衡体育老师想找一个合适的中点将队伍分成两边使得两个队伍力量总值相差最小。你来帮体育老师想想办法输入第一行有两个正整数。一个整数N 2 = N = 500000表示小Q班上的人数。第二行有N个整数依次表示
思路:
- 首先读入输入的N和力量值数组P。
- 计算力量值数组的总和total。
- 假设中点位置为i,从1到N-1依次遍历。
- 计算左半边队伍的力量值总和left_sum,初始值为0。
- 计算右半边队伍的力量值总和right_sum,初始值为total。
- 遍历数组P,将前i个元素加入left_sum,将剩余的元素加入right_sum。
- 计算两个队伍力量值总和的差值diff,初始值为|left_sum - right_sum|。
- 如果diff小于当前最小差值min_diff,则更新min_diff为diff,并更新中点位置为i。
- 输出中点位置i和i+1。
代码实现:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int N;
cin >> N;
int P[N];
int total = 0;
for (int i = 0; i < N; i++) {
cin >> P[i];
total += P[i];
}
int left_sum = 0;
int right_sum = total;
int min_diff = abs(left_sum - right_sum);
int mid = 0;
for (int i = 0; i < N - 1; i++) {
left_sum += P[i];
right_sum -= P[i];
int diff = abs(left_sum - right_sum);
if (diff < min_diff) {
min_diff = diff;
mid = i;
}
}
cout << mid + 1 << " " << mid + 2 << endl;
return 0;
}
时间复杂度分析: 遍历力量值数组需要O(N)的时间,因此总的时间复杂度为O(N)
原文地址: http://www.cveoy.top/t/topic/hY5c 著作权归作者所有。请勿转载和采集!