您的位置:首页 > 其它

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

5

6

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: