1. 程式人生 > >C++演算法紅黑方塊排序問題

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...