打表+暴搜

这道题目,显然是需要打表的,不过打表的方式可以有很多。

我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒

然后我们就可以暴搜了,大体就是枚举等式左边两个数每一位的值,并枚举中间的运算符是\(+\)还是\(-\),然后计算出等式右边的值,判断是否合法。

中间过程可以加上一些剪枝。

注意当火柴棒从某一位移到另一位时,我们可以规定,去除火柴棒需要算步数,加入火柴棒则无需算步数,这样就可以避免重复了。

具体实现有一些小细节,可以参考代码

代码

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 20
#define Gmin(x,y) (x>(y)&&(x=(y)))
using namespace std;
const int q[10]={6,2,5,5,4,5,6,3,7,6};//打表
const int p[10][10]=//打表
{
{0,0,1,1,1,1,1,0,0,1},{0,0,1,0,0,1,1,0,0,0},{1,1,0,1,2,2,1,1,0,1},{1,0,1,0,1,1,1,0,0,0},{1,0,2,1,0,1,1,1,0,0},
{1,1,2,1,1,0,0,1,0,0},{1,1,1,1,1,0,0,1,0,1},{0,0,1,0,1,1,1,0,0,0},{0,0,0,0,0,0,0,0,0,0},{1,0,1,0,0,0,1,0,0,0}
};
int n,a[N+5],b[N+5];string s;
class Dfser//暴搜
{
private:
int ans;
I void Calc(CI x,CI y,RI v,CI w)//计算,判断答案是否合法
{
if(w<0) return;RI i,t,k=0,t1=0,t2=0;for(i=x;i^n;++i) t1+=b[i];
t=w;W(t2+=q[t%10],++k,t/=10);if(k>n-x||(t1+y)^t2) return;
for(t=w,i=n-1;i>=x;--i)
{
if(i^(n-1)&&!t) return;
v+=p[a[i]][t%10]+max(b[i]-q[t%10],0),t/=10;
}Gmin(ans,v);
}
I void dfs(CI x,CI y,CI v,CI sv,CI op,CI tot)//暴搜,枚举每一位的值和运算符
{
if(abs(y)>5*(n-x)||ans<=v) return;if(s[x]=='=') return Calc(x+1,y,v,tot+sv*op);
if(s[x]=='+') dfs(x+1,y,v,0,1,tot+sv*op),dfs(x+1,y+1,v+1,0,-1,tot+sv*op);
else if(s[x]=='-') dfs(x+1,y,v,0,-1,tot+sv*op),dfs(x+1,y-1,v,0,1,tot+sv*op);
else
{
dfs(x+1,y,v,sv*10+a[x],op,tot);
for(RI i=!((x&&isdigit(s[x-1]))||!isdigit(s[x+1]));i<=9;++i)
a[x]^i&&(dfs(x+1,y+b[x]-q[i],v+p[a[x]][i]+max(b[x]-q[i],0),sv*10+i,op,tot),0);
}
}
public:
I void Solve() {ans=1e9,dfs(0,0,0,0,1,0),ans==1e9?puts("-1"):printf("%d",ans);}
}D;
int main()
{
freopen("A.in","r",stdin),freopen("A.out","w",stdout);
cin>>s,n=s.length(),s+="@";for(RI i=0;i^n;++i) b[i]=q[a[i]=s[i]&15];
return D.Solve(),0;
}

【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)的更多相关文章

  1. 【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)

    可持久化并查集 显然是可持久化并查集裸题吧... 就是题面长得有点恶心,被闪指导狂喷. 对于\(K\)操作,直接\(O(1)\)赋值修改. 对于\(R\)操作,并查集上直接连边. 对于\(T\)操作, ...

  2. 【2019.7.25 NOIP模拟赛 T1】变换(change)(思维+大分类讨论)

    几个性质 我们通过推式子可以发现: \[B⇒AC⇒AAB⇒AAAC⇒C\] \[C⇒AB⇒AAC⇒AAAB⇒B\] 也就是说: 性质一: \(B,C\)可以相互转换. 则我们再次推式子可以发现: \[ ...

  3. 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)

    树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...

  4. 【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)

    数位\(DP\) 首先考虑二进制数\(G(i)\)的一些性质: \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\).因为这样就可以进位到第\(x+2\)位.其余情况下,这 ...

  5. 【2019.7.22 NOIP模拟赛 T1】麦克斯韦妖(demon)(质因数分解+DP)

    暴力\(DP\) 先考虑暴力\(DP\)该怎么写. 因为每个序列之后是否能加上新的节点只与其结尾有关,因此我们设\(f_i\)为以\(i\)为结尾的最长序列长度. 每次枚举一个前置状态,判断是否合法之 ...

  6. 【2019.7.24 NOIP模拟赛 T1】道路建设(road)(水题)

    原题与此题 原题是一道神仙不可做题,两者区别在于,原题不能有重边和自环. 然而,这题可以有重边... 于是这题就变成了一道大水题. 此题的解法 考虑如何构造. 对于\(n\le10^4\)的情况: 对 ...

  7. 【2019.7.26 NOIP模拟赛 T1】数字查找(figure)(数学)

    推式子 我们设\(n=kp+w\),则: \[(kp+w)a^{kp+w}\equiv b(mod\ p)\] 将系数中的\(kp+w\)向\(p\)取模,指数中的\(kp+w\)根据欧拉定理向\(p ...

  8. 【2019.7.16 NOIP模拟赛 T1】洗牌(shuffle)(找环)

    找环 考虑每次洗牌其实是一次置换的过程,而这样必然就会有循环出现. 因此我们直接通过枚举找出每一个循环,询问时只要找到环上对应的位置就可以了. 貌似比我比赛时被卡成\(30\)分的倍增简单多了? 代码 ...

  9. 【2019.7.15 NOIP模拟赛 T1】夹缝(mirror)(思维题)

    思维题 此题应该是比较偏思维的. 假设一次反射后前进的距离是\(2^x(2y+1)\),则显然,它可以看做是前进距离为\(2^x\)的光线经过了\((2y+1)\)次反射,两者是等价的,甚至后者可能还 ...

随机推荐

  1. 【Java】String的首尾去空和判空

    去除字符串首尾空白字符:包括\t,\r,\n及" ": //去除字符串首尾空白字符:包括\t,\r,\n及" ": System.out.println(&qu ...

  2. Python连载49-正则举例

    一.re举例 import re #查找数字 p = re.compile(r"\d+") #在字符串“ongahjeuf125”中及逆行查找,按照规则p指定的正则进行查找 m = ...

  3. 一文学会 TypeScript 的 82% 常用知识点(下)

    一文学会 TypeScript 的 82% 常用知识点(下) 前端专栏 2019-11-23 18:39:08     都已经 9021 年了,TypeScript(以下简称 TS)作为前端工程师不得 ...

  4. PHP面试题大全(值得收藏)

    PHP进阶.面试:文档.视频资源点击免费获取 一 .PHP基础部分 1.PHP语言的一大优势是跨平台,什么是跨平台? PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操 ...

  5. 推荐 | 中文文本标注工具Chinese-Annotator(转载)

    自然语言处理的大部分任务是监督学习问题.序列标注问题如中文分词.命名实体识别,分类问题如关系识别.情感分析.意图分析等,均需要标注数据进行模型训练.深度学习大行其道的今天,基于深度学习的 NLP 模型 ...

  6. Zuul 1.x 的工作原理

    Zuul简介 Zuul在微服务架构中,可以作为提供动态路由,监控,弹性,安全等边缘服务的框架.在Netflix,被用作所有请求到达streaming application的前门.Zuul使用一系列不 ...

  7. C# Stocket

    介绍 1.TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计 ...

  8. 如何使用 CODING 进行瀑布流式研发

    你好,欢迎使用CODING!这份最佳实践将帮助你通过 CODING 更好地实践瀑布流式开发流程. 什么是瀑布流式研发 1970 年温斯顿·罗伊斯(Winston Royce)提出了著名的"瀑 ...

  9. [b0026] python 归纳 (十一)_线程_threading.Thread

    总结: 默认父线程跑完,子线程并不会马上退出,不像 thread.start_threadXXXX 父线程跑完了,并没有退出,一直在那里 线程启动速度很快,不占多少开销,不到1毫 秒 代码: # -* ...

  10. 记录console的使用

    一般信息:console.info("这是info") 除错信息:console.debug() 警告提示:console.warn() 错误提示:console.error() ...