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;
}
posted on 2012-08-25 01:50  一把刷子  阅读(288)  评论(0编辑  收藏  举报