Dreisam Equations

{ 两个网站的题有点不一样(ZJH有特判)POJ时间卡得紧,建议去POJ过 }

题目大意:

  给你一个字符串:是一个等式,等式左边是一个数,右边由若干个数和()构成,要求加入(+、- 或 *)来使得等式成立,注意:这道题抛弃了原本的优先级,除了括号一律采用从左到右的计算顺序。

题目陷阱:

  测试数据中可能有 2= (1)(1) 或者 2=((1)1) ,不一定只是在空格处加符号。

题目思路:

  可以对原字符串进行加工,也就是先预先处理空格,不过这样子比较麻烦,可以考虑到,符号只能加在以下四种情况:

  1.  数字 和 数字 之间

  2.  数字 和 (    之间

  3.  )    和 数字 之间

  4.  )    和 (    之间

  这样子分情况以后就容易了许多,可以遍历一遍字符串,将数字存到num数组,( 当作 -1,)当作 -2,有可能加符号的地方当作 -3;

  然后深入优先搜索,遍历所有可能,因为最多等号右边12个数,也就是最多11个符号,也就是3的11次方,基本不会超时。

AC 代码:(两个网站的题 long long 的格式不一样,所以%I64d 可能需要改下)

  1. #include<stdio.h>
  2. typedef long long LL;
  3. LL sum;
  4. LL num[],no;
  5. LL st[],so;
  6. char tt[];
  7. LL to;
  8.  
  9. void push(LL x)
  10. {
  11. if(to==||to>&&tt[to-]=='(') st[so++]=x;
  12. else
  13. {
  14. switch(tt[to-])
  15. {
  16. case '+':st[so-]=st[so-]+x;break;
  17. case '-':st[so-]=st[so-]-x;break;
  18. case '*':st[so-]=st[so-]*x;break;
  19. default: break;
  20. }
  21. to--;
  22. }
  23. }
  24.  
  25. // -4 +
  26. // -5 -
  27. // -6 *
  28.  
  29. bool dfs(int pos)
  30. {
  31. if(pos>=no)
  32. {
  33. if(st[so-]==sum) return true;
  34. else return false;
  35. }
  36. if(num[pos]==-)
  37. {
  38. LL Sst[],Sso=so;
  39. for(int i=;i<so;i++)
  40. Sst[i]=st[i];
  41. char Stt[];
  42. LL Sto=to;
  43. for(int i=;i<to;i++)
  44. Stt[i]=tt[i];
  45. num[pos]=-;
  46. tt[to++]='+';
  47. if(dfs(pos+)) return true;
  48. so=Sso;
  49. for(int i=;i<so;i++)
  50. st[i]=Sst[i];
  51. to=Sto;
  52. for(int i=;i<to;i++)
  53. tt[i]=Stt[i];
  54. num[pos]=-;
  55. tt[to++]='-';
  56. if(dfs(pos+)) return true;
  57. so=Sso;
  58. for(int i=;i<so;i++)
  59. st[i]=Sst[i];
  60. to=Sto;
  61. for(int i=;i<to;i++)
  62. tt[i]=Stt[i];
  63. num[pos]=-;
  64. tt[to++]='*';
  65. if(dfs(pos+)) return true;
  66. num[pos]=-;
  67. }
  68. else if(num[pos]==-)
  69. {
  70. tt[to++]='(';
  71. if(dfs(pos+)) return true;
  72. }
  73. else if(num[pos]==-)
  74. {
  75. to--;
  76. so--;
  77. push(st[so]);
  78. if(dfs(pos+)) return true;
  79. }
  80. else
  81. {
  82. push(num[pos]);
  83. if(dfs(pos+)) return true;
  84. }
  85. return false;
  86. }
  87. int main()
  88. {
  89. char s[];
  90. int cas=;
  91. while(gets(s))
  92. {
  93. if(s[]==''&&s[]==) break;
  94. int i=;
  95. no=;
  96. for(;s[i];i++)
  97. {
  98. if(s[i]<=''&&s[i]>='')
  99. {
  100. if(no>&&num[no-]!=-) num[no++]=-;
  101. num[no]=;
  102. for(;s[i]<=''&&s[i]>='';i++)
  103. {
  104. num[no]=num[no]*+s[i]-'';
  105. }
  106. no++;
  107. i--;
  108. }
  109. else if(s[i]=='(')
  110. {
  111. if(no>&&num[no-]!=-) num[no++]=-;
  112. num[no++]=-;
  113. }
  114. else if(s[i]==')')
  115. {
  116. num[no++]=-;
  117. }
  118. }
  119. sum=num[];
  120. so=to=;
  121. printf("Equation #%d:\n",cas++);
  122. if(!dfs())
  123. {
  124. printf("Impossible\n\n");
  125. }
  126. else
  127. {
  128. printf("%I64d=",sum);
  129. for(int i=;i<no;i++)
  130. {
  131. if(num[i]>=) printf("%I64d",num[i]);
  132. else
  133. {
  134. switch(num[i])
  135. {
  136. case -:printf("(");break;
  137. case -:printf(")");break;
  138. case -:printf("+");break;
  139. case -:printf("-");break;
  140. case -:printf("*");break;
  141. default:break;
  142. }
  143. }
  144. }
  145. printf("\n\n");
  146. }
  147. }
  148. return ;
  149. }

ZJU_1145 OR POJ_1100 Dreisam Equations的更多相关文章

  1. 【解题报告】zju-1145 Dreisam Equations

    原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=145 题目大意:在给定的等式右边数字之间加上加.减.乘运算符,使等式成 ...

  2. 狗狗40题~(Volume B)

    H - Sorting Slides 应该是个二分匹配的模板题的,但我还不会写 = = 其实数据规模很小,就用贪心的方法就水过了(没加vis判冲突wa了几发,从此开始艰难的没有1A 的生活) #inc ...

  3. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  4. A.Kaw矩阵代数初步学习笔记 5. System of Equations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  5. [家里蹲大学数学杂志]第269期韩青编《A Basic Course in Partial Differential Equations》 前五章习题解答

    1.Introduction 2.First-order Differential Equations Exercise2.1. Find solutons of the following inti ...

  6. Represent code in math equations

    Introduce The article shows a way to use math equations to represent code's logical. Key ideas logic ...

  7. EM basics- the Maxwell Equations

    All the two important problems that the EM theory trys to describe and explain are propogation and r ...

  8. FITTING A MODEL VIA CLOSED-FORM EQUATIONS VS. GRADIENT DESCENT VS STOCHASTIC GRADIENT DESCENT VS MINI-BATCH LEARNING. WHAT IS THE DIFFERENCE?

    FITTING A MODEL VIA CLOSED-FORM EQUATIONS VS. GRADIENT DESCENT VS STOCHASTIC GRADIENT DESCENT VS MIN ...

  9. ACM题目————Equations

    Description Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b, c, d a ...

随机推荐

  1. RandomAccess

    在List集合中,我们经常会用到ArrayList以及LinkedList集合,但是通过查看源码,就会发现ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的 ...

  2. 【转】vmware的macos中apple ID一直登陆不上解决 ---(伪造smbios设备信息)

    伪造smbios设备信息 原文网址:http://www.insanelymac.com/forum/topic/292170-how-to-spoof-real-mac-in-vmware/page ...

  3. ①---Java开发环境配置

    Java 开发环境配置 以下将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.c ...

  4. PyCharm 中使用 Pylint 控制代码质量

    1) Pylint安装 - Windows下: 直接在 cmd 下使用 pip install pylint 即可(如果 pip 不可用,首先安装最新版 Python,会默认安装 pip,或者找到 p ...

  5. day13----迭代器、生成器、枚举对象

    一.迭代器: 定义: (从装有多个值的容器中一次取出一个值给外界) 器:迭代器是个容器,包含多个值 迭代:循环反馈,从容器中一次取出一个值 迭代器不同于索引取值,但是也可以从容器对象中从前往后逐个返回 ...

  6. ftp环境搭建并创建虚拟用户

    1. 首先安装ftp yum install -y vsftpd 2. 修改配置文件   cd /etc/vsftpd /etc/vsftpd/vsftpd.conf //主配置文件,核心配置文件 / ...

  7. python调用数据返回字典dict数据的现象2

    python调用数据返回字典dict数据的现象2 思考: 话题1连接:https://www.cnblogs.com/zwgbk/p/10248479.html在打印和添加时候加上内存地址id(),可 ...

  8. CF434D Nanami's Power Plant 最小割

    传送门 因为连距离限制的边的细节调了贼久QAQ 这个题和HNOI2013 切糕性质相同,都是有距离限制的最小割问题 对于每一个函数,用一条链记录变量\(x\)在不同取值下这个函数的贡献.对于一个\(x ...

  9. C# 生成编号(防并发)

    今天抽了点时间,写了一个通用的生成编号的程序! 我的生成规则为年月日+两位编号,即:yyyyMMdd+两位编号,譬如:2018101001 / 2018101002 / 2018101003 首先,一 ...

  10. 前后端分离的利器:fiddler的实用功能举例

    # 前后端分离的利器:fiddler的实用功能举例 ##what's fiddler fiddler是一款代理软件,对于前后端分离开发非常重要.可以说,如果前端开发没有用上fiddler或类似软件,那 ...