C++挑战3

连续相同的符号

题目描述

给定 n 个数,填上一定的符号(只能够填 +、-、× ),求最多填多少个相同且连续的符号能让式子的答案为 t

输入格式

输入三行。
第一行 1 个数 n ,为给定的数字个数。
第二行 n 个数,是所有给定的数字。
第三行 1 个数 t ,为给定的式子的理想答案。

输出格式

输出一行,为最多填多少个相同且连续的符号能让式子的答案为 t 的个数,如果等式不能的答案不能为 t ,输出 no

样例 #1

样例输入 #1

3
1 2 4
7

样例输出 #1

2

样例 #2

样例输入 #2

5
6 6 2 1 1
18

样例输出 #2

3

样例 #3

样例输入 #3

4
3 4 2 1
30

样例输出 #3

no

提示

【样例解释 #1
式子的答案为 7 的答案只有一种: 1+2+4=7
所以,本题最多连续 2 个加号。

【样例解释 #2
式子有多种答案为 18 的方法,如: 6+6×2-1+1
显然,这种答案并不是最优解,最优解为连续 3 个乘号的答案,如下: 6+6×2×1×1

【样例解释 #3
式子最大也就是这种情况: 3×4×2×1 ,答案为 24 ,所以不可能达到 30 的答案。

哥你LaTeX炸了
美元符号左右没加空格

还有你的数据范围呢?

image
。。。

同问

不是AC代码,不要举报

虽然没提交的地方,但没事干,随手写了一个,有点问题(样例2炸了,输出的no,其他过了)QwQ

帮帮我

这个代码将涉及以下几个重点:

  1. 记录连续相同的符号:在添加符号时,要检测并记录最大的连续符号数量。
  2. 考虑不同的符号组合:通过递归生成所有可能的符号组合并进行计算。

WA代码如下

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int n;
vector<int> numbers;
int target;

void Max(int index, int& cnt, char lastOp, int count, int currentValue) {
	if (index == n - 1) {
		if (currentValue == target) {
			cnt = max(cnt, count);
		}
		return;
	}
	
	// 尝试使用加号
	char currentOp = '+';
	if (currentOp == lastOp) {
		Max(index + 1, cnt, lastOp, count + 1, currentValue + numbers[index + 1]);
	} else {
		Max(index + 1, cnt, currentOp, 1, currentValue + numbers[index + 1]);
	}
	
	// 尝试使用减号
	currentOp = '-';
	if (currentOp == lastOp) {
		Max(index + 1, cnt, lastOp, count + 1, currentValue - numbers[index + 1]);
	} else {
		Max(index + 1, cnt, currentOp, 1, currentValue - numbers[index + 1]);
	}
	
	// 尝试使用乘号
	currentOp = '*';
	if (currentOp == lastOp) {
		Max(index + 1, cnt, lastOp, count + 1, currentValue * numbers[index + 1]);
	} else {
		Max(index + 1, cnt, currentOp, 1, currentValue * numbers[index + 1]);
	}
}

int main(void) 
{
	cin >> n;
	numbers.resize(n);
	for (int i = 0; i < n; i++) {
		cin >> numbers[i];
	}
	cin >> target;
	
	int cnt = 0;
	
	// 开始递归,index从0开始,初始最大连续符号数为0,初始值为第一个数字
	Max(0, cnt, '#', 0, numbers[0]);
	
	if (cnt > 0) {
		cout << cnt;
	} else {
		cout << "no";
	}
	
	return 0;
}

dalao help!