测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A45687. 42点42 是:· 组合数学上的第 5 个卡特兰数· 字符'*'的 ASCII 码· 钼的原子序数· 6 与 9 的乘积结果的 13 进制表示· 生命、 宇宙以及任何事情的终极答案· 以及……表达式(1+5)/2*(6-4)*7 的值因此, 小机器人 Marvin 发明了这个叫 42 点的小游戏。在这个游戏中,玩家会获得 n 个数。 玩家需要使用'+'、 '-'、 '*'、 '/'、 '('、 …

填空题 困难

题目描述

42点

42 是:

· 组合数学上的第 5 个卡特兰数

· 字符'*'的 ASCII 码

· 钼的原子序数

· 6 与 9 的乘积结果的 13 进制表示

· 生命、 宇宙以及任何事情的终极答案

· 以及……表达式(1+5)/2*(6-4)*7 的值

因此, 小机器人 Marvin 发明了这个叫 42 点的小游戏。在这个游戏中,玩家会获得 n 个数。 玩家需要使用'+'、 '-'、 '*'、 '/'、 '('、 ')'以及这 n 个数构成一个合法的中缀表达式, 并使得该表达式的值为 42。 n 个数之间的顺序可以改变。 表达式运算过程中只能出现整数。由于过于抑郁, Marvin 无力完成这个游戏, 于是来找你帮忙。 你的任务是对于给定的 n 个数, 判断他们是否能根据上述游戏规则算出 42。

时间限制: 1000

内存限制: 65536

输入

第一行为一个数 n, 1<=n<=6。 第二行为 n 个数, 每个数均为[1,13]范围内的整数。

输出

输出一行, 若可以算出 42 则输出“YES”, 否则输出“NO”(注意大小写)。

样例输入

6

1 5 2 6 4 7

样例输出

YES

参考答案

#include <cstdio> #include <string> #include <memory.h> #include <algorithm> #include <stdlib.h> #include <math.h> #include <iostream> #include<queue> #include <set> using namespace std; set<int> dp[7][7]; int num[7],n; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &num[i]); dp[i][i].insert(num[i]); } int sum = 1; for (int i = 2; i <= n; i++) sum += i; for (int _case = 1; _case <= sum; _case++) { next_permutation(num, num + n); for(int i=2;i<=n;i++) for (int j = 1; j <= n - i + 1; j++) { for (int k = j; k <= j+i-2; k++) { for(auto ii=dp[j][k].begin();ii!=dp[j][k].end();ii++) for (auto jj = dp[k + 1][j + i - 1].begin(); jj != dp[k + 1][j + i - 1].end(); jj++) { dp[j][j + i - 1].insert(*ii + *jj); dp[j][j + i - 1].insert(abs(*ii - *jj)); dp[j][j + i - 1].insert(*ii * *jj); if (*jj != 0 && (*ii / (*jj)*(*jj)) == *ii) dp[j][j + i - 1].insert(*ii / (*jj)); } } } } if (dp[1][n].find(42) != dp[1][n].end()) printf("YES\n"); else printf("NO\n"); return 0; }
上一题 下一题