zoukankan      html  css  js  c++  java
  • codeforces 58E:Expression

    Description

    One day Vasya was solving arithmetical problems. He wrote down an expression a + b = c in his notebook. When the teacher checked Vasya's work it turned out that Vasya had solved the problem incorrectly. Now Vasya tries to find excuses. He says that he simply forgot to write down several digits in numbers a, b and c, but he can't remember what numbers they actually were. Help Vasya, find such numbers x, y and z, with which the following conditions are met:

        x + y = z,
        from the expression x + y = z several digits can be erased in such a way that the result will be a + b = c,
        the expression x + y = z should have the minimal length.

    Input

    The first and only input line contains the expression a + b = c (1 ≤ a, b, c ≤ 106, a, b and c don't contain leading zeroes) which is the expression Vasya wrote down.
    Output

    Print the correct expression x + y = z (x, y and z are non-negative numbers without leading zeroes). The expression a + b = c must be met in x + y = z as a subsequence. The printed solution should have the minimal possible number of characters. If there are several such solutions, you can print any of them.
    Examples
    Input

    2+4=5

    Output

    21+4=25

    Input

    1+1=3

    Output

    1+31=32

    Input

    1+1=2

    Output

    1+1=2

    正解:搜索

    解题报告:

      今天考试T6,9道题里面唯一一道没动的,开始以为是E题就会很难...

      简单思路就是搜索,每次看一下当前的个位是否相等,如果相等,那么显然可以约掉这个已经相等的个位并只处理高位,当然记得进位;否则,我们考虑a、b、c三个元素,保持两个不变,我们把第三个增加一位使得末位与另外两位对应,然后其余部分直接往前推一位,也就是×10。直到c=0,那么肯定只需要把c的最高位补一个a+b剩下的数就可以了,算一下位数。当然要加一个最优性剪枝。

     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <ctime>
     9 #include <vector>
    10 #include <queue>
    11 #include <map>
    12 #include <set>
    13 using namespace std;
    14 typedef long long LL;
    15 int ans,ansa,ansb;
    16 LL mi[19];
    17 
    18 inline int getint()
    19 {
    20        int w=0,q=0; char c=getchar();
    21        while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 
    22        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
    23 }
    24 
    25 inline void dfs(LL a,LL b,LL c,LL nowa,LL nowb,LL jin,int nowl,int wei){
    26     if(nowl>=ans) return ; 
    27     if(a==0&&b==0&&c==0&&jin==0) { ans=nowl; ansa=nowa; ansb=nowb; return ; }
    28     if(c==0) {
    29     int tot=0; LL lin=a+b+jin; while(lin) tot++,lin/=10;//全部加给c
    30     dfs(0,0,0,nowa+a*mi[wei],nowb+b*mi[wei],0,nowl+tot,wei);
    31     return;
    32     }
    33     if((a+b+jin)%10==c%10) dfs(a/10,b/10,c/10,nowa+a%10*mi[wei],nowb+b%10*mi[wei],(a%10+b%10+jin)/10,nowl,wei+1);//去掉已经相等的低位部分,记得给公共的低位部分进位
    34     else{
    35     dfs(a*10+(c+10-b%10-jin)%10,b,c,nowa,nowb,jin,nowl+1,wei);//a后面加一位与前两个数还有进位的和的个位部分
    36     dfs(a,b*10+(c+10-a%10-jin)%10,c,nowa,nowb,jin,nowl+1,wei);//b后面加一位与前两个数还有进位的和的个位部分
    37     dfs(a,b,c*10+(a+b+jin)%10,nowa,nowb,jin,nowl+1,wei);///c后面加一位与前两个数还有进位的和的个位部分
    38     }
    39 }
    40 
    41 inline void work(){
    42     int a,b,c;  scanf("%d+%d=%d",&a,&b,&c);
    43     ans=12; mi[0]=1; for(int i=1;i<=18;i++) mi[i]=mi[i-1]*10;
    44     dfs(a,b,c,0,0,0,0,0);
    45     printf("%d+%d=%d",ansa,ansb,ansa+ansb);
    46 }
    47 
    48 int main()
    49 {
    50   work();
    51   return 0;
    52 }
  • 相关阅读:
    纯JS实现中国行政区域上下联动选择地址
    java解析中国行政区域并在页面显示实现动态逐级筛选
    使用HttpClient 发送get、post请求,及其解析xml返回数据
    JS实现动态提示文本框可输入剩余字数(类似发表微博数字提示)
    webApi 数据绑定 获取
    EF Code First 常用命令
    [解决WebClient或HttpWebRequest首次连接缓慢问题]
    【转】Entity Framework技术系列之7:LINQ to Entities
    Ajax方法提交整个表单的信息
    【转】MVC中处理Json和JS中处理Json对象
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5886279.html
Copyright © 2011-2022 走看看