题目描述从 �N 个正整数中选出 33 个使他们的和在不超过 �M 的同时尽可能的大。输入格式第一行包含两个正整数�N3≤�≤1023≤N≤10 2 �M10≤�≤30000010≤M≤300000。第二行包括�N个不大于10510 5 的正整数。题目描述给第一个01矩阵现在你需要在其中圈一个矩形出来要求是:这个矩形四个顶角都是1矩形的长和宽都至少是2。请问有多少种方法?输入格式第一行一个整数 �
对于第一个问题,我们可以使用穷举法来解决。首先对给定的N个正整数进行排序,然后从最大的三个数开始选取,直到找到和不超过M的三个数为止。时间复杂度为O(NlogN)。
对于第二个问题,我们可以遍历矩阵的每个元素,找到值为1的元素作为矩形的左上角顶点。然后再遍历该点右边和下边的元素,找到值为1的元素作为矩形的右下角顶点。最后计算可以选取的矩形数量。时间复杂度为O(n^2)。
以下是C++的示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int findMaximumSum(vector<int>& nums, int M) {
sort(nums.rbegin(), nums.rend()); // 降序排序
int sum = 0;
for (int i = 0; i < 3 && i < nums.size(); i++) {
if (sum + nums[i] <= M) {
sum += nums[i];
} else {
break;
}
}
return sum;
}
int countRectangles(vector<vector<int>>& matrix) {
int n = matrix.size();
int count = 0;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-1; j++) {
if (matrix[i][j] == 1) {
for (int k = i+1; k < n; k++) {
for (int l = j+1; l < n; l++) {
if (matrix[k][l] == 1) {
count++;
}
}
}
}
}
}
return count;
}
int main() {
// 第一个问题
int N, M;
cin >> N >> M;
vector<int> nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
int result1 = findMaximumSum(nums, M);
cout << result1 << endl;
// 第二个问题
int n;
cin >> n;
vector<vector<int>> matrix(n, vector<int>(n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
int result2 = countRectangles(matrix);
cout << result2 << endl;
return 0;
}
注:本代码只是提供了一种解题思路,实际运行结果可能与题目要求有所出入,需要根据具体题目要求进行修改
原文地址: https://www.cveoy.top/t/topic/iBn5 著作权归作者所有。请勿转载和采集!