工作环境(蓝色粗体字为特别注意内容)
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...