zoukankan      html  css  js  c++  java
  • 洛谷 P1555 尴尬的数字

    题目背景

    Bessie刚刚学会了不同进制数之间的转换,但是她总是犯错误,因为她的两个前蹄不能轻松的握住钢笔。

    题目描述

    每当Bessie将一个数转换成新的进制时,她总会写错一位数字。例如,她将14转化成2进制数,正确的结果是"1110",但她可能会写成"0110"或"1111"。Bessie从不会意外的增加或删减数字,所以她可能会写出以"0"开头的错误数字。

    给出Bessie转换后N的2进制形式和3进制形式,请计算出N的正确数值(用十进制表示)。N可能会达到10亿,输入数据保证解的存在唯一性。

    输入输出格式

    输入格式:

     

    第一行,N的2进制表示(有一位是错误的数字)

    第二行,N的3进制表示(有一位是错误的数字)

     

    输出格式:

     

    N的正确值

     

    输入输出样例

    输入样例#1: 复制
    1010
    212
    输出样例#1: 复制
    14

    思路:爆搜可过。

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int len1,len2;
    long long sum1;
    char s1[10000],s2[10000];
    int num1[10000],num2[10000];
    void dfs(long long num,int tot,int pos){
        if(tot==len2){
            if(sum1==num){
                cout<<sum1;
                exit(0);
            }
            return ;
        }
        if(pos)    dfs(num+num2[tot]*pow(3,tot),tot+1,pos);
        else{
            if(num2[tot]!=0&&tot!=len2-1)    dfs(num,tot+1,1);
            else dfs(num,tot+1,pos);
            if(num2[tot]!=1)    dfs(num+pow(3,tot),tot+1,1);
            else dfs(num+pow(3,tot),tot+1,pos);
            if(num2[tot]!=2)    dfs(num+2*pow(3,tot),tot+1,1);
            else dfs(num+2*pow(3,tot),tot+1,pos);
        }
    }
    int main(){
        scanf("%s",s1);scanf("%s",s2);
        len1=strlen(s1);
        len2=strlen(s2);
        if(s1[0]=='0'){
            for(int i=0;i<len1;i++)
                sum1+=pow(2,i)*(s1[len1-1-i]-'0');
            long long x=pow(2,len1-1);
            cout<<sum1+x;
            return 0;
        }
        if(s2[0]=='0'){
            for(int i=0;i<len2;i++)
                sum1+=pow(3,i)*(s2[len2-1-i]-'0');
            long long x=pow(3,len2-1);
            cout<<sum1+x;
            return 0;
        }
        for(int i=0;i<len1;i++)    num1[i]=s1[len1-1-i]-'0';
        for(int i=0;i<len2;i++)    num2[i]=s2[len2-1-i]-'0';
        for(int i=0;i<len1;i++)    sum1+=pow(2,i)*num1[i];
        for(int i=0;i<len1;i++){
            if(num1[i]&&i!=len1-1)    sum1-=pow(2,i);
            else sum1+=pow(2,i);
            dfs(0,0,0);
            if(num1[i]&&i!=len1-1)    sum1+=pow(2,i);
            else sum1-=pow(2,i);
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    AI 最小二乘法
    AI 前馈神经网络
    AI 雅可比(Jacobian)矩阵
    AI 递归神经网络(RNN)
    AI 循环神经网络(RNN)
    js操作地址栏
    JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
    php实现的三个常用加密解密功能函数示例
    php 获取URL 各部分参数
    PHP实现队列及队列原理
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8213308.html
Copyright © 2011-2022 走看看