BZOJ 3360 [Usaco2004 Jan]算二十四 dfs+模拟
2017-10-25 11:46
267 查看
Description
写一个程序,给出D(2≤D≤10)个数字,按原顺序在数字间加+,一,×算出24,且不使用括号.优先级按正常的优先级处理,即先做乘法后做加减法.输出有多少种不同的方案数.
Input
第1行:一个整数D.第2到D+1行:D个整数,在1到50之间.
Output
输出方案总数.
Sample Input
56
4
2
8
16
Sample Output
4样例说明
四种方法分别是6x4x2-8-16,6-4- 2+8+16,6x4-2 x8+16,6×4+2×8-16.
HINT
传送门总共才9个符号啊= =
O(3^D)爆搜就好了。。
中间可能要用到+,-,*表达式求值,那就先把-后面的数取负了,然后再*,最后+。
#include<bits/stdc++.h> #define ll long long using namespace std; int n,ans,g[11],a[11]; ll b[11]; ll calc(){ for (int i=1;i<=n;i++) b[i]=a[i]; for (int i=1;i<n;i++) if (g[i]==2) b[i+1]=-b[i+1]; for (int i=1;i<n;i++) if (g[i]==0) b[i+1]=b[i+1]*b[i],b[i]=0LL; ll s=0LL; for (int i=1;i<=n;i++) s+=b[i]; return s; } void dfs(int now){ if (now==n){ if (calc()==24) ans++; return; } g[now]=0,dfs(now+1); g[now]=1,dfs(now+1); g[now]=2,dfs(now+1); } int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); dfs(1); printf("%d\n",ans); return 0; }
相关文章推荐
- bzoj 3360: [Usaco2004 Jan]算二十四(暴力+表达式求值)
- 3360: [Usaco2004 Jan]算二十四
- BZOJ3355: [Usaco2004 Jan]有序奶牛
- bzoj 3359: [Usaco2004 Jan]矩形(DP)
- bzoj 3356: [Usaco2004 Jan]禁闭围栏(扫描线+树状数组)
- [BZOJ3358][Usaco2004 Jan]洪水
- bzoj 3359: [Usaco2004 Jan]矩形
- BZOJ3356 : [Usaco2004 Jan]禁闭围栏
- bzoj 3356: [Usaco2004 Jan]禁闭围栏 离散化+树状数组
- bzoj 3355: [Usaco2004 Jan]有序奶牛(拓扑排序+bitset)
- BZOJ 3359: [Usaco2004 Jan]矩形( dp )
- bzoj 3358: [Usaco2004 Jan]洪水
- bzoj 3361: [Usaco2004 Jan]培根距离
- BZOJ3355 : [Usaco2004 Jan]有序奶牛
- bzoj 3361: [Usaco2004 Jan]培根距离
- BZOJ 1576: [Usaco2009 Jan]安全路经Travel【最短路树】【树链剖分】
- BZOJ3382: [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三
- bzoj 1635: [Usaco2007 Jan]Tallest Cow 最高的牛——差分
- bzoj 3357: [Usaco2004]等差数列
- BZOJ1635: [Usaco2007 Jan]Tallest Cow 最高的牛