题意及思路

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

代码:

#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. 选择排序的php实现 Selection Sort

    选择排序Selection Sort的PHP实现,安全按照算法所写. 同一排序算法下,需要趟数最多的数列是什么数列呢?思考中. 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序 ...

  2. python中正则表达式的一些问题

    今天听到一句话,觉得很在理——"当你遇到一个问题,想到用正则表达式解决时,就变成了两个问题" 这也从侧面说明了正则表达式比较难理解.下面我将用通俗易懂的方式总结一下,最近遇到的一些 ...

  3. python中常用的文件和目录操作(一)

    常用的文件操作 1. 打开文件 open,它是一个内置函数,可以直接调用 语法:file object = open(file_name, [access_mode]),这里我们会创建一个file对象 ...

  4. SVN服务器端客户端配置, 及对比VSS的优势

    SVN 版本服务器搭配全过程详解(含服务端.客户端) SVN服务器端及客户端全套软件 SVN对比VSS的优势 两者区别:http://www.cnblogs.com/zxjyuan/archive/2 ...

  5. 进程、线程、ThreadLlocal

    1.线程是最小的执行单位,而进程中至少一个线程组:如果调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间 Unix/Linux操作系统提供了一个fork()系统调用,它非常 ...

  6. BZOJ - 2142 礼物 (扩展Lucas定理)

    扩展Lucas定理模板题(貌似这玩意也只能出模板题了吧~~本菜鸡见识鄙薄,有待指正) 原理: https://blog.csdn.net/hqddm1253679098/article/details ...

  7. LeetCode Image Smoother

    原题链接在这里:https://leetcode.com/problems/image-smoother/description/ 题目: Given a 2D integer matrix M re ...

  8. linux使用收集

    Centos7 命令 # 查询正运行的java进程,建议使用jps,使用ps会将tail也显示出来 jps -lvm | grep '/home/chencye/tomcat/apache-tomca ...

  9. 自动化框架httpClient实例

    package com.auto.test.util; import java.net.SocketException;import java.net.SocketTimeoutException;i ...

  10. [转]HTMl中Meta标签详解以及meta property=og标签含义

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之 ...