月赛 T1 题解
lovely_hyzhuo · · 题解
首先,我们打一个暴力出来。
就是从
代码如下。
#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;
}
这样就有
然后,根据观察可以发现,如果想让连续的两个数字相等,只可能是连续的二和三,或是进位的零和九(九进位),当且仅当此时十位为二和三(进位前和后)。
不妨大胆乱搞,最多只跑十次,算出此时的最大连续数,即可 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;
}