2345安全卫士
(蛋小黄(蒟蒻))
1
连续相同的符号
题目描述
给定 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 的答案。
linan04143
(Star lit Journey「y.t.x」)
6
不是AC代码,不要举报
虽然没提交的地方,但没事干,随手写了一个,有点问题(样例2炸了,输出的no,其他过了)QwQ
帮帮我
这个代码将涉及以下几个重点:
- 记录连续相同的符号:在添加符号时,要检测并记录最大的连续符号数量。
- 考虑不同的符号组合:通过递归生成所有可能的符号组合并进行计算。
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!