对于第一个问题,我们可以使用穷举法来解决。首先对给定的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;
}

注:本代码只是提供了一种解题思路,实际运行结果可能与题目要求有所出入,需要根据具体题目要求进行修改

题目描述从 �N 个正整数中选出 33 个使他们的和在不超过 �M 的同时尽可能的大。输入格式第一行包含两个正整数�N3≤�≤1023≤N≤10 2 �M10≤�≤30000010≤M≤300000。第二行包括�N个不大于10510 5 的正整数。题目描述给第一个01矩阵现在你需要在其中圈一个矩形出来要求是:这个矩形四个顶角都是1矩形的长和宽都至少是2。请问有多少种方法?输入格式第一行一个整数 �

原文地址: https://www.cveoy.top/t/topic/iBn5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录