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对象的引用计数

如何从后台弹出片段

cf1132E. Knapsack(搜索)

如何在 BottomNavigationView 的片段上打开搜索界面?

sql server中的charindex函数用法解析(在一段字符中搜索字符或者字符串-----返回expression1在expression2出现的位置;反之,返回0)

CF 990B B. Micro-World数组操作/贪心/STL/二分搜索