C++算法红黑方块排序问题

工作环境(蓝色粗体字为特别注意内容)

1,开发环境:Windows CL编译器,Vim编辑器

2,编程语言:C++

有个公司的C++笔试中有这样一道编程题:

方块积木,红色代表正数A,黑色代表负数B,选出17块积木排成一排,
使得任意相邻7块积木之和都小于0,如何挑选才能使得17块积木之和最大,最大值是多少?

输入
正数A 负数B
A和B的绝对值小于10000
输出
积木之和的最大值

样例输入

10 -61

样例输出

28

这个题目的思路是这样的:

1、先把正数赋值个一个长度为17的数组。

2、定义一个长度为7的窗口,该窗口从数组的第一位开始逐位往后移动

3、当发现位于窗口内的数之和大于等于0则从该窗口最后一位开始插入负数,直到位于窗口内的数之和小于0

具体C++代码如下:

/**********************************************
 * 
 *        Injoy Life   Injoy  Programming 
 * 
 * Author :          Pang
 * Email :          1***[email protected]
 * Last modified :	2018-09-12 22:02
 * Filename :		Main.cpp
 * Description :    有红黑两种颜色的方块积木,红色代表正数A,黑色代表负数B,选出17块积木排成一排,
                    使得任意相邻7块积木之和都小于0,如何挑选才能使得17块积木之和最大,最大值是多少
 * Copyright:       Copyright c 2015 Pang. All rights reserved.
 **********************************************/
#include<iostream>
using namespace std;

#define ARR_LENGTH 17
#define WINDOW_SIZE 7
/**
 * @brief printfArr 输出数组
 *
 * @param arr 需要打印的数组
 * @param length 数组长度
 */
void printfArr(int *arr, int length)
{
	int j = 0;
	cout << "input:";
	for(j = 0; j < length; j++)
	{
		cout << arr[j] << " ";
	}
	cout << endl;
}

/**
 * @brief sum 计算数组元素之和
 *
 * @param arr 数组
 * @param i 起始下标
 * @param j 终止下标
 *
 * @Return:  求和结果
 */
int sum(int *arr, int i, int j)
{
	int k   = 0;
	int tmp = 0;
	for(k = i; k < j; k++)
	{
		tmp = tmp + arr[k];
	}
	return tmp;
}

/**
 * @brief main 主函数
 *
 * @Return:  
 */
int main()
{
	int *input   = new int[2];  // 输入两个数A,B
	int *arr     = new int[ARR_LENGTH];
	int i        = 0;           // 下标
	int j        = 0;           // 下标
	char c;                     // 输入字符
	int result   = 1;           // 数组求和
	while((c = getchar()) != '\n')
	{
		if(c != ' ')            // 把这句判断条件改动
		{
			ungetc(c, stdin);
			cin >> input[j];
			// cout<<">>"<<arr[i][j]<<endl;
			j++;
		}
	}

	for(j = 0; j < ARR_LENGTH ; j++)
	{
		arr[j] = input[0];
	}

	j = 1;

    // 移动窗口
	for(i = 0; i <= ARR_LENGTH-WINDOW_SIZE; i++)
	{
		result = 1;
		while(result > 0)
		{
			result = sum(arr, i, i + WINDOW_SIZE);
			if(result >= 0)
			{
				arr[i + WINDOW_SIZE - j] = input[1];
				j++;
			}
			else
			{
				j = 1;
			}

		}

	}

	result = sum(arr, 0, ARR_LENGTH);
	cout << result << endl;
    // 打印最后的数组
	printfArr(arr,ARR_LENGTH);
	return 0;
}

测试输出为:

C:\windows\system32\cmd.exe /c Main
10 -61
28
input:10 10 10 10 10 10 -61 10 10 10 10 10 10 -61 10 10 10
Hit any key to close this window...
扫描二维码关注公众号,回复: 4056211 查看本文章

猜你喜欢

转载自blog.csdn.net/pang9998/article/details/82670644