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;

}

你可能感兴趣的:(uva)