C++算法笔试题

给定一个整数数组,计算所有可能的连续子数组的区间,使得区间内最小数乘以区间内所有数之和得到的值最大。程序通过回溯算法找出所有子集,并计算每个子集的值,最终输出最大值。输入描述包含数组长度和序列,输出为最大计算值。示例输入为[6, 2, 1],输出为36。
摘要由CSDN通过智能技术生成

给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:

区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;

从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。
区间内的所有数字都在[0, 100]的范围内;
输入描述:

第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据,  1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;

输出描述:

输出数组经过计算后的最大值。

输入例子1:

3
6 2 1

输出例子1:

36
错!!
#include <stdio.h>
#include<iostream>
#include <string.h>
#include <string>
#include <stdlib.h>
#include<vector>
#include<algorithm>

#include<deque>
using namespace std;


/*
10
81 87 47 59 81 18 25 40 56 0
为啥第511往后的vector全是空的
*/
vector<vector<int>> subsets(vector<int>&nums);
//回溯求组合
vector<vector<int>> subsets(vector<int>& nums) {
	// base case,返回一个空集
	if (nums.empty()) return{ {} };
	// 把最后一个元素拿出来
	int n = nums.back();
	nums.pop_back();
	//sort(nums.begin(), nums.end());
	// 先递归算出前面元素的所有子集
	vector<vector<int>> res = subsets(nums);

	int size = res.size();
	for (int i = 0; i < size; i++) {
		// 然后在之前的结果之上追加
		res.push_back(res[i]);
		res.back().push_back(n);
	}
	return res;
}

int main(int argc, char** argv)
{
	int n;
	vector<int> nums;
	vector<vector<int>>results;
	cin >> n;
	int value;
	for (int i = 0; i < n; i++) {
		cin >> value;
		nums.push_back(value);
	}
	results = subsets(nums);
	int length = results.size();

	int MAX = 0;
	for (int i = 1; i < length; i++) {
		//计算每个vector<int>的值
		int sum = 0;  //初始化子列的和
		int result = 0;  //结果= sum*min
		int min = 0;//最小的值
		for (int j = 0; j < results[i].size(); j++) {
			//排除空集
			if (!results[i][j] == NULL) {
				//求和
				sort(results[i].begin(), results[i].end());
				sum += results[i][j];
				//找出子列表中的最小值
				result = results[i][0] * sum;
				cout << i << "," << j <<" : "<<result << endl;
			}
			if (MAX < result)
				MAX = result;
		}
	}
	cout << MAX;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值