C++演算法紅黑方塊排序問題
阿新 • • 發佈:2018-11-13
工作環境(藍色粗體字為特別注意內容)
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...