C++题目:6239 三个正整数关卡:枚举时空限制CPU占用时长 1秒内存使用限制 64MB题目描述从 �N 个正整数中选出 33 个使他们的和在不超过 �M 的同时尽可能的大。输入格式第一行包含两个正整数�N3≤�≤1023≤N≤10 2 �M10≤�≤30000010≤M≤300000。第二行包括�N个不大于10510 5 的正整数。数据保证至少存在33个正整数的和不超过�M。输出格式输出一行
解法一:枚举所有可能的三个数的组合,求出它们的和,如果和不超过M,更新最大总和。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
int maxSum = 0;
for (int i = 0; i < N-2; i++) {
for (int j = i+1; j < N-1; j++) {
for (int k = j+1; k < N; k++) {
int sum = nums[i] + nums[j] + nums[k];
if (sum <= M) {
maxSum = max(maxSum, sum);
}
}
}
}
cout << maxSum << endl;
return 0;
}
解法二:先对数组进行排序,然后从数组的最大值开始枚举,假设最大值为x,那么剩下的两个数的和不超过M-x,找到最接近M-x的两个数的和,然后和x的和就是当前的最大总和。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
sort(nums.begin(), nums.end());
int maxSum = 0;
for (int i = N-1; i >= 2; i--) {
int target = M - nums[i];
int left = 0, right = i-1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum <= target) {
maxSum = max(maxSum, sum + nums[i]);
left++;
} else {
right--;
}
}
}
cout << maxSum << endl;
return 0;
}
``
原文地址: https://www.cveoy.top/t/topic/ixSW 著作权归作者所有。请勿转载和采集!