首页 > 2020.08.16大疆嵌入式B卷第一道编程题
头像
起一个能变胖的名字
编辑于 2020-08-17 18:46
+ 关注

2020.08.16大疆嵌入式B卷第一道编程题

求出数组中两个不重叠的连续子数组的最大和。

输入:
10
1 -1 2 2 3 -3 4 -4 5 -5
输出:
13
子串为:[2 2 3 -3 4]、[5]

5
-5 9 -5 11 20
40

10
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-2

#include <stdio.h>
/*
 *@function:找出数组中连续子数组最大和
 *@param     arr: 数组指针
 *@param    size: 数组长度
 *@param    left: 返回连续子数组的左下标
 *@param   right: 返回连续子数组的右下标
 *@retval:整数串中连续子数组最大和
 */
int seek_max_string(int arr[], int size, int *left, int *right)
{
	int a,b,max = -0x7fffffff,ans=0;
	for(int i=0; i<size; i++)
	{
		for(int j=i; j<size; j++)
		{
			ans += arr[j];
			if(ans > max)
				max=ans,*left=i,*right=j;
		}
		ans=0;
	}
	return max;
}

/*
 *@function:找出数组下标从left->right中最小值
 *@param     arr: 数组指针
 *@param    left: 左下标
 *@param   right: 右下标
 *@retval:数组中最小值
 */
int seek_min_number(int arr[], int left, int right)
{
	int min=0x7fffffff;
	for(int i=left; i<=right; i++)
	{
			if(min > arr[i])
				min=arr[i];
	}
	return min;
}


int main()
{
	int N;
	while(scanf("%d",&N) != EOF){
		int arr[N];
		for(int i=0; i<N; i++)
			scanf("%d",&arr[i]);

		int left,right,max,min;
		int a,b,c,d,second_max=0,third_max=0,sub_max=0;//sub_max:第二个子串和最大值
		
		max = seek_max_string(arr, N, &left, &right);
		min = seek_min_number(arr, left, right);
		
		/*
		 *找到的子数组分四种情况(1)子数组在数组中间(2)子数组就是数组(3)子数组在数组最左(4)子数组在数组最右
		 *四种情况分别找寻第二子数组
		 */
		if(left != 0 && right != N-1)
		{
			second_max = seek_max_string(arr,         left-1,    &a, &b);
			third_max  = seek_max_string(arr+right+1, N-right-1, &c, &d);
			sub_max = second_max>third_max? second_max:third_max;
		}
		else if(left == 0 && right == N-1){
			sub_max = 0;
		}
		else if(left != 0 && right == N-1){
			second_max = seek_max_string(arr,     left,   &a, &b);
			sub_max = second_max;
		}
		else if(left == 0 && right != N-1){
			int *left_arr = arr;
			third_max  = seek_max_string(left_arr+right+1, N-right-1, &c, &d);
			sub_max = third_max;
		}		
		

		
		
		if(min+sub_max >= 0 || (max < 0 && sub_max<0)) //  需要找两个子数组 
			printf("%d\n", max+sub_max);
		else                               //  找到的第一个数组包含两个最大子数组
			printf("%d\n", max-min);

	}
	return 0;
}

当时没来得及做,有不对地方请指正

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐