月赛 T1 题解

· · 题解

首先,我们打一个暴力出来。

就是从 l 到 r 依次枚举算出每个数字的数字和,同时记录上一个数的数字和,判断累加即可。

代码如下。

#include<bits/stdc++.h>
using namespace std;
int a[10]={6,2,5,5,4,5,6,3,7,6};
int tnum[1000010];
int  main()
{
    int l,r;
    cin>>l>>r;
    int ans=1,sum=1;
    for(int i=l;i<=r;i++)
    {
        int g=i;
        while(g)
        {
            int t=g%10;
            g/=10;
            tnum[i]+=a[t];
        }
        if(i==l)
            continue;
        if(tnum[i]!=tnum[i-1])
        {
            ans=max(ans,sum);
            sum=1;
        }
        else
            sum++;
    }
    cout<<max(ans,sum);
    return 0;
}

这样就有 52 分的好成绩。

然后,根据观察可以发现,如果想让连续的两个数字相等,只可能是连续的二和三,或是进位的零和九(九进位),当且仅当此时十位为二和三(进位前和后)。

不妨大胆乱搞,最多只跑十次,算出此时的最大连续数,即可 AC。

关于最多只有两个数的说明。

显然,当十位,百位及以上数位均相同时,个位的火柴棍数一样才可能继续,而个位相同只有如上情况。

故最多只有连续的两个数可满足题目要求。

最终代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[10]={6,2,5,5,4,5,6,3,7,6};
int tnum[30];
signed  main()
{
    int l,r;
    cin>>l>>r;
    int ans=1,sum=1;
    for(int i=l;i<=min(r,l+10);i++)
    {
        int g=i;
        while(g)
        {
            int t=g%10;
            g/=10;
            tnum[i-l]+=a[t];
        }
        if(i==l)
            continue;
        if(tnum[i-l]!=tnum[i-1-l])
        {
            ans=max(ans,sum);
            sum=1;
        }
        else
            sum++;
    }
    cout<<max(ans,sum);
    return 0;
}