zoukankan      html  css  js  c++  java
  • uva 4965 Sum the Square

    http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2966

    之前看题的时候没有注意到每一个数最后都会有了循环这句话,解决了这个问题后又开始担心数组太大开不下10的9次方。但讨论了下最大的那个数也是81*10

    所以开1000就够了。然后我们设置一个visit数组,来表示数字是否出现过,,以及出现了几次。对于读入的两个数a,b如果大于1000那么他不存入visit数组

    对于a求出他的合乎要求的序列,对于b在开一个visitb数组,求出b的序列,同时在visit里面也要标记,然后遍历visit数组,那么出现两次的地方就是有交点的地方,为了加速

    我们开数组p来表示每一数对应的出现的次序,特别要注意大于1000的情况要加上之前的步数。

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #define inf 0x7fffffff
    using namespace std;
    int  visit[15000];
    int vb[15000];
    long long  p[2][10000];
    long long ok(long long m)
    {
        long long sum=0;
        while(m>0)
        {
            int a=m%10;
            sum+=a*a;
            m/=10;
        }
        return sum;
    }
    int main()
    {
        long long  a;
        long long  b;
        int oo=2;
        int oo1=0;
        while(cin>>a>>b)
        {
            long long t1=a;
            long long t2=b;
            if(a==0&&b==0)break;
            memset(visit,0,sizeof(visit));
            memset(vb,0,sizeof(vb));
            memset(p,0,sizeof(p));
            if(a==b)cout<<a<<" "<<b<<" "<<oo<<endl;
            else
            {
            int counta=0;
            int countb=0;
            if(a<=1000)p[0][a]=++counta,visit[a]=1;
            while(1)
            {
                long long tempa=ok(a);
                if(visit[tempa]==0)p[0][tempa]=++counta,visit[tempa]++,a=tempa;
                else
                break;
            }
            if(b<=1000)p[1][b]=++countb,visit[b]++,vb[b]=1;
            while(1)
            {
                long long tempb=ok(b);
                if(vb[tempb]==0)p[1][tempb]=++countb,visit[tempb]++,vb[tempb]=1,b=tempb;
                else
                break;
            }
            long long  ans=inf;
            int flage=0;
            for(int i=0;i<1500;i++)
            {
    
                if(visit[i]==2)
                {
    
                    flage=1;
                    if(t1>1000&&t2>1000)
                    ans=min(ans,p[0][i]+p[1][i]+2);
                    else
                    if(t1>1000||t2>1000)
                    {ans=min(ans,p[0][i]+p[1][i]+1);}
                    else
                    ans=min(ans,p[0][i]+p[1][i]);
    
                }
            }
            if(flage==1)
                cout<<t1<<" "<<t2<<" "<<ans<<endl;
            else
                cout<<t1<<" "<<t2<<" "<<oo1<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    c++11 static_assert
    UVA
    析构函数与运行错误
    UVA
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区) C. Coconut
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区) A. Banana
    DOCTYPE的作用?
    数组去重的方法
    闭包的分析?
    SVN(集中式管理)分析
  • 原文地址:https://www.cnblogs.com/cs1003/p/2655601.html
Copyright © 2011-2022 走看看