CF58E Expression 搜索
Posted itst
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF58E Expression 搜索相关的知识,希望对你有一定的参考价值。
题目传送门:http://codeforces.com/problemset/problem/58/E
题意:给出一个形如$x+y=z$(不一定正确)的式子,试输出一个$a+b=c$的式子,满足:$1.$等式成立;$2.$等式由给出的$x+y=z$等式加入若干数字得到;$3.$在满足前两个要求的前提下式子最短。若有多组输出任意一组均可。给出的等式中所有的数大小均不超过$10^6$
与虫食算一题很相似。
考虑从最后一位开始进行搜索。对于其中某一位,至多只有两种情况:加入一个数使这一位上运算成立,或者这一位上本就运算成立,无需加入数。
所以答案范围在$10^{14}$之内,搜索可以完成
注意本题的细节:在运算某一位时,如果某一个数结果为$0$,而更高位上还需要补数字,这是不可行的。
因为各种魔改所以代码极其难看
1 #include<bits/stdc++.h>
2 using namespace std;
3 int now[15][3] , ans[15][3] , nA , nB , nC , minN = 12 , cnt , t[13];
4 //now是当前加了哪些数
5 //ans是最终答案加了哪些数
6 void dfs(int a , int b , int c , int num , int jw , int cou , bool ifA , bool ifB){
7 //abc记录当前三个数还有多少没有算
8 //num记录加了几个数
9 //cou表示加法共有几位
10 //ifA与ifB表示是否还能够再a或b上加数
11 if(!a && !b && !c && !jw){
12 minN = num;
13 cnt = cou;
14 memcpy(ans , now , sizeof(now));
15 return;
16 }
17 //注意:下面的四个dfs前的if中的条件都有c!=0!!!
18 if(a % 10 + b % 10 - c % 10 + jw == 0 && c)
19 dfs(a / 10 , b / 10 , c / 10 , num , 0 , cou + 1 , a ? 0 : 1 , b ? 0 : 1);
20 else if(a % 10 + b % 10 - c % 10 + jw == 10 && c)
21 dfs(a / 10 , b / 10 , c / 10 , num , 1 , cou + 1 , a ? 0 : 1 , b ? 0 : 1);
22 else{
23 if(minN - ++num <= 0) return;
24 now[num][2] = ++cou;
25 if(!ifA && c){
26 now[num][0] = 1;
27 now[num][1] = (c % 10 - b % 10 - jw + 10) % 10;
28 bool f = ifB;
29 if(!b) ifB = 1;
30 dfs(a , b / 10 , c / 10 , num , (now[num][1] + b % 10 + jw - c % 10) / 10 , cou , ifA , ifB);
31 ifB = f;
32 }
33 if(!ifB && c){
34 now[num][0] = 2;
35 now[num][1] = (c % 10 - a % 10 + 10 - jw) % 10;
36 bool f = ifA;
37 if(a == 0) ifA = 1;
38 dfs(a / 10 , b , c / 10 , num , (now[num][1] + a % 10 + jw - c % 10) / 10 , cou , ifA , ifB);
39 ifA = f;
40 }
41 now[num][0] = 3;
42 now[num][1] = (a % 10 + b % 10 + jw) % 10;
43 if(!a) ifA = 1;
44 if(!b) ifB = 1;
45 dfs(a / 10 , b / 10 , c , num , (a % 10 + b % 10 + jw - now[num][1]) / 10 , cou , ifA , ifB);
46 }
47 }
48 int main(){
49 int a , b , c;
50 bool f;
51 scanf("%d+%d=%d" , &a , &b , &c);
52 dfs(a , b , c , 0 , 0 , 0 , 0 , 0);
53 //一个很迷的输出
54 int p = 1;
55 while(p <= minN && ans[p][0] - 1) p++;
56 for(int i = 1 ; i <= cnt ; i++)
57 if(p <= minN && ans[p][2] == i){
58 t[i] = ans[p++][1];
59 while(p <= minN && ans[p][0] - 1) p++;
60 }
61 else{
62 t[i] = a % 10;
63 a /= 10;
64 }
65 f = 0;
66 for(int i = cnt ; i ; i--)
67 if(f || t[i]){
68 putchar(t[i] + ‘0‘);
69 f = 1;
70 }
71 putchar(‘+‘);
72 p = 1;
73 while(p <= minN && ans[p][0] - 2) p++;
74 for(int i = 1 ; i <= cnt ; i++)
75 if(p <= minN && ans[p][2] == i){
76 t[i] = ans[p++][1];
77 while(p <= minN && ans[p][0] - 2) p++;
78 }
79 else{
80 t[i] = b % 10;
81 b /= 10;
82 }
83 f = 0;
84 for(int i = cnt ; i ; i--)
85 if(f || t[i]){
86 putchar(t[i] + ‘0‘);
87 f = 1;
88 }
89 putchar(‘=‘);
90 p = 1;
91 while(p <= minN && ans[p][0] - 3) p++;
92 for(int i = 1 ; i <= cnt ; i++)
93 if(p <= minN && ans[p][2] == i){
94 t[i] = ans[p][1];
95 p++;
96 while(p <= minN && ans[p][0] - 3) p++;
97 }
98 else{
99 t[i] = c % 10;
100 c /= 10;
101 }
102 f = 0;
103 for(int i = cnt ; i ; i--)
104 if(f || t[i]){
105 putchar(t[i] + ‘0‘);
106 f = 1;
107 }
108 return 0;
109 }
以上是关于CF58E Expression 搜索的主要内容,如果未能解决你的问题,请参考以下文章
OC对象与CF对象的相互转换 和 ARC下查看OC对象的引用计数
如何在 BottomNavigationView 的片段上打开搜索界面?
sql server中的charindex函数用法解析(在一段字符中搜索字符或者字符串-----返回expression1在expression2出现的位置;反之,返回0)