题意及思路

模拟场上用一般方法枚举非常麻烦,一个小时没写出来,还是自己太菜了。。。用表达式树枚举有一个好处,判断需不需要加括号非常方便,只有当前节点运算符的优先级高于子节点的时候,才需要给子节点加一个括号。

代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int cost[] = {0,1,1,2,2,3,1,2,2,3,3,4,2,3,3,4,4,5,3,4,4,5,5,6};
int ans = INF, num_cnt, flag_cnt;
int a[10], sum;
int b[5] = {0, 1, 2, 3, 4}, c[10];
struct node{
int val, ls, rs;
};
node tr[110];
void init() {
   tr[1].ls=2;tr[1].rs=3;tr[2].ls=4;tr[2].rs=5;tr[3].ls=6;tr[3].rs=7;
tr[8].ls=9;tr[8].rs=10;tr[9].ls=11;tr[9].rs=12;tr[11].ls=13;tr[11].rs=14;
tr[15].ls=16;tr[15].rs=17;tr[16].ls=18;tr[16].rs=19;tr[19].ls=20;tr[19].rs=21;
tr[22].ls=23;tr[22].rs=24;tr[24].ls=25;tr[24].rs=26;tr[25].ls=27;tr[25].rs=28;
tr[29].ls=30;tr[29].rs=31;tr[31].ls=32;tr[31].rs=33;tr[33].ls=34;tr[33].rs=35;
}
bool is_leaf(int x) {
return (tr[x].ls == 0) && (tr[x].rs == 0);
}
int op(int x, int y, int flag) {
if(x == -INF || y == -INF) return -INF;
if(flag == 0) return x + y;
if(flag == 1) return x - y;
if(flag == 2) return x * y;
if((y == 0) || (flag == 3 && (x % y) != 0 )) return -INF;
return x / y;
}
void build_tree(int x) {
if(tr[x].ls == 0 && tr[x].rs == 0) {
tr[x].val = a[b[++num_cnt]];
return;
} else {
tr[x].val = c[++flag_cnt];
build_tree(tr[x].ls);
build_tree(tr[x].rs);
}
}
int cal(int x) {
if(tr[x].ls == 0 && tr[x].rs == 0) return tr[x].val;
if(tr[x].val >= 2) {
if(!is_leaf(tr[x].ls) && tr[tr[x].ls].val < 2) sum++;
if(!is_leaf(tr[x].rs) && tr[tr[x].rs].val < 2) sum++;
}
return op(cal(tr[x].ls), cal(tr[x].rs), tr[x].val);
}
int main() {
for (int i = 1; i <= 4; i++)
scanf("%d", &a[i]);
int now_state = 0;
init();
do {
for (int t = 0; t < 5; t++) {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
for (int k = 0; k < 4; k++) {
c[1] = i, c[2] = j, c[3] = k;
flag_cnt = num_cnt = 0;
sum = cost[now_state] * 2;
build_tree(7 * t + 1);
int now = cal(7 * t + 1);
if(now == 24) {
ans = min(ans, sum);
}
}
}
now_state++;
}while(next_permutation(b + 1, b + 1 + 4));
if(ans == INF) printf("impossible\n");
else printf("%d\n", ans);
}

  

gym - 101673I Twenty Four, Again (表达式树枚举)的更多相关文章

  1. 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举

    注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...

  2. 轻量级表达式树解析框架Faller

    有话说 之前我写了3篇关于表达式树解析的文章 干货!表达式树解析"框架"(1) 干货!表达式树解析"框架"(2) 干货!表达式树解析"框架" ...

  3. 干货!表达式树解析"框架"(1)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 关于我和表达式树 其实我也没有深入了解表达式树一些内在实现的原理 ...

  4. 干货!表达式树解析"框架"(2)

    最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 为了过个好年,我还是赶快把这篇完成了吧 声明 本文内容需要有一定 ...

  5. 16.C#初见Lambda表达式及表达式树(九章9.1-9.3)

    在说明Lambda相关知识前,我们需要了解Lambda表达式常用于LINQ,那么我们来聊下LINQ. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑: ...

  6. C#表达式树的初步了解

    在很早以前就听说过表达式树了,但并没有去了解它.虽然自己用过linq to sql和linq to entity,但也就用着就用着,并没有去深究c#代码怎么会生成sql代码而不是IL.废话不多说了,开 ...

  7. 表达式树解析"框架"

    干货!表达式树解析"框架"(2)   为了过个好年,我还是赶快把这篇完成了吧 声明 本文内容需要有一定基础的开发人员才可轻松阅读,如果有难以理解的地方可以跟帖询问,但我也不一定能回 ...

  8. asp.net core 排序过滤分页组件:sieve(2)表达式树的复习

    在Sieve组件中使用了很多关于表达式树的知识,但在我们日常的工作中写表达式树的机会是非常少的,至少在我的编程生涯中没怎么写过表达式树(可能也就是3,4次).所以,为了能够看懂Sieve里面的源代码, ...

  9. C# - LINQ 表达式树

    表达式树(Expression Tree) 表达式树是不可执行的代码,它只是用于表示一种树状的数据结构,树上的每一个节点都表示为某种表达式类型,大概有25种表达式类型,它们都派生自Expression ...

随机推荐

  1. 利用ChromeOptions()加载用户配置

    一. 如何绕过页面登录 我们在登录网站的时候,通常需要输入用户名.密码和验证码,那么有没有办法绕过登录环节呢? 有两种方法可以解决这个问题,一种是利用chrome浏览器的用户配置,一种是利用cooki ...

  2. 解决:xampp中Apache, MySql, Filezilla端口占用问题

    读 静觅 的python博客,学到requests库的用法,看到“”如果想请求JSON文件,可以利用 json() 方法解析 ”这里迷惑了: 我写了a.json文件放在本地,却不能被python调用, ...

  3. PromiseJs

    (function() { var define, requireModule, require, requirejs; (function() { var registry = {}, seen = ...

  4. Apache CommonLogging + Log4J

    package cn.byref.demo.logging; import org.apache.commons.logging.Log; import org.apache.commons.logg ...

  5. Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化

    转自:http://blog.csdn.net/wh_springer/article/details/51842496 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上 ...

  6. 《领域驱动设计 C# 2008 实现》 - 书摘精要

    (P2) 智能客户反模式被 Eric Evans 定义为“把所有业务逻辑放进用户界面.把系统分解成小函数,作为分离的用户界面实现,并在里面嵌入业务规则.使用关系数据库作为共享的数据仓储.使用现有的自动 ...

  7. len(),range()函数

    len()函数返回字符串.列表.字典.元组等长度 eg1:计算字符串的长度: >>>s='hello good boy doiido' >>>len(s) > ...

  8. cscope配置和使用

    , cscope安装 软件下载:http://sourceforge.net/project/showfiles.php?group_id=4664 软件安装: ./configure --with- ...

  9. C++之结构体struct

    原创博客,转载请注明出处! 1.简介 # C++提供一些基本的数据类型(int,float,double,char等),但由于程序处理的问题通常较复杂,基本的数据类型不能满足程序需要,因此C++允许用 ...

  10. HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)

    题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...