zoukankan      html  css  js  c++  java
  • BFS:HDU2054-A==B?(字符串的比较)

                                                                                                              A == B ?

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 64960    Accepted Submission(s): 10164


    Problem Description
    Give you two numbers A and B, if A is equal to B, you should print "YES", or print "NO".
     

    Input
    each test case contains two numbers A and B.
     

    Output
    for each case, if A is equal to B, you should print "YES", or print "NO".
     

    Sample Input
    1 2 2 2 3 3 4 3
     

    Sample Output
    NO
    YES
    YES
    NO




    解题心得:
    1、这个题很水,不要想得太简单也不要想得太难。就是用数字的规则比较两个字符串是否相等,但是会有小数,还有后导0。
    2、其实写这种水题比较考验思维,思维混乱的,写得乱七八糟,要冷静地去思考,考虑是否可以使用stl解决。如果不可以再手动比较,手动比较的时候理清楚思维,不要写得一团乱麻,程序员不要太勤劳,用代码去硬怼题,越写越乱在后面找bug的时候就要炸了。思维清晰,分部分分功能去写。



    调用stl(strcmp)的代码:
    //使用strcmp,只需要将小数点后面的字符0改为数字0,就可以全部解决了
    
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5;
    char a[maxn],b[maxn];
    
    bool check_pointa()
    {
        for(int i=0; i<maxn ;i++)
            if(a[i] == '.')
                return true;
        return false;
    }
    bool check_pointb()
    {
        for(int i=0; i<maxn ;i++)
            if(b[i] == '.')
                return true;
        return false;
    }
    int main()
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        while(scanf("%s%s",a,b)!=EOF)
        {
    
            bool flaga = false,flagb = false;
            //检查是否有小数点,有小数点将小数点后面无用的字符0化为数字0方便后面的比较
            flaga = check_pointa();
            flagb = check_pointb();
            
            if(flaga)
            {
                for(int i=maxn-1;i>=0;i--)
                {
                    if(a[i]=='0' || a[i] ==0)
                        a[i] = 0;
                    else
                    {
                        if(a[i] == '.')
                            a[i] = 0;
                        break;
                    }
                }
            }
            
            if(flagb)
            {
                for(int i=maxn-1;i>=0;i--)
                {
                    if(b[i]=='0' || b[i] ==0)
                        b[i] = 0;
                    else
                    {
                        if(b[i] == '.')
                            b[i] = 0;
                        break;
                    }
                }
            }
    
            if(strcmp(a,b) == 0)//直接比较,因为已经将字符0改为了数字0,前导0也就不用管了
                printf("YES
    ");
            else
                printf("NO
    ");
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
        }
        return 0;
    }
    



    手动比较的代码:(这个玩意儿复杂死了,都不知道当时自己为什么这么勤快居然老老实实写完了)
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5;
    char a[maxn],b[maxn];
    int lena,lenb;
    int posa,posb;
    
    void cmp1()
    {
        if(lena != lenb)//数位不等直接返回
        {
            printf("NO
    ");
            return ;
        }
        
        for(int i=0; i<lena; i++)//数位相等直接比较
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
        printf("YES
    ");
    }
    
    void cmp2()
    {
        if(posb != lena)//b的整数数位比a大,直接返回
        {
            printf("NO
    ");
            return;
        }
        
        for(int i=posb+1; i<lenb; i++)//因为a是整数,只要b的小数部分不全为0直接返回
        {
            if(b[i] != '0')
            {
                printf("NO
    ");
                return ;
            }
        }
        
        for(int i=0; i<posb; i++)//b小数部分为0,整数数位相等,逐位比较就好
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
            
        printf("YES
    ");
    }
    
    void cmp3()
    {
        //和cmp2差不多
        if(posa != lenb)
        {
            printf("NO
    ");
            return;
        }
        for(int i=posa+1; i<lena; i++)
        {
            if(a[i] != '0')
            {
                printf("NO
    ");
                return ;
            }
        }
        for(int i=0; i<posa; i++)
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
        printf("YES
    ");
    }
    
    void cmp4()
    {
        if(posa != posb)//整数数位不相等直接返回
        {
            printf("NO
    ");
            return;
        }
        
        for(int i=0; i<posa; i++)//整数数位相等,逐位比较
            if(a[i] != b[i])
            {
                printf("NO
    ");
                return;
            }
            
        int len1 = min(lena - posa - 1,lenb - posb -1);//以较短的那个小数位数的为标准进行诸位比较
        for(int i=0; i<len1; i++)
        {
            if(a[i+posa] != b[i+posb])
            {
                printf("NO
    ");
                return;
            }
        }
        
        int len2 = max(lena - posa - 1,lenb - posb - 1);//小数数位比较多的那个多出来的部分不为字符0也不相等
        int len = len2 - len1;
        if(len2 == lena - posa - 1)//a的位数更多
        {
            for(int i=0; i<len; i++)
                if(a[i+len1+1+posa] != '0')
                {
                    printf("NO
    ");
                    return;
                }
        }
        
        if(len2 == lenb - posb - 1)//b的位数更多
        {
            for(int i=0; i<len; i++)
                if(b[i+len1+1+posb] != '0')
                {
                    printf("NO
    ");
                    return;
                }
        }
        printf("YES
    ");
    }
    
    int main()
    {
        while(scanf("%s%s",a,b)!=EOF)
        {
            lena = strlen(a);
            lenb = strlen(b);
            posa = 0,posb = 0;
            bool flaga = false,flagb = false;
            int len = max(lena,lenb);
            
            //将小数部分和整数部分分开,同时也检查是否有小数部分
            for(int i=0; i<len; i++)
            {
                if(a[i] == '.')
                {
                    posa = i;
                    flaga = true;
                }
                if(b[i] == '.')
                {
                    posb = i;
                    flagb = true;
                }
            }
    
            //都只用整数部分
            if(!flaga && !flagb)
                cmp1();
            
            //a只有整数部分,b有小数部分
            if(!flaga && flagb)
                cmp2();
                
            //b只有整数部分,a有小数部分
            if(flaga && !flagb)
                cmp3();
                
            //都有小数部分
            if(flaga && flagb)
                cmp4();
        }
    }




  • 相关阅读:
    POJ 1015 Jury Compromise【DP】
    POJ 1661 Help Jimmy【DP】
    HDU 1074 Doing Homework【状态压缩DP】
    HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
    占坑补题。。最近占的坑有点多。。。
    Codeforces 659F Polycarp and Hay【BFS】
    Codeforces 659E New Reform【DFS】
    Codeforces 659D Bicycle Race【计算几何】
    廖大python实战项目第四天
    廖大python实战项目第三天
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107349.html
Copyright © 2011-2022 走看看