P10024题解
思路
\([i,j]\) 之间所有数所用的短竖线数量要想等,那么 \(i\) 和 \(i+1\) 一定要相等。
分两种情况:
- 如果 \(i+1\) 不进位。
这意味着 \(i\) 和 \(i+1\) 所用短竖线唯一可能产生变化的是个位。我们设 \(i\) 的个位是 \(x\),\(i+1\) 的个位是 \(y\)。
\(x\) 和 \(y\) 肯定是相邻的两个数,观察每个数需要的短竖线可得知,相邻的两个数只有 \(2\) 和 \(3\) 用的短竖线数量相同。
那么 \(x\) 和 \(y\) 必须分别等于 \(2\) 和 \(3\)。
- 如果 \(i+1\) 进位。
那么 \(i\) 的个位为 \(9\),\(i+1\) 的个位为 \(0\)。
这是个位所用短竖线数量是不变的。但是还有十位。
十位又要分进位和不进位,然后继续如上方法考虑。
你不需要继续考虑 \(i+2\),因为它所用的短竖线数量绝对不与前两项相等。因为如果想要相等就必须先满足个位相等,但是没有连续三个数字所用短竖线数量相等。
所以答案只能是 \(2\) 或 \(1\)。
那么枚举算法就出炉了。
让 \(i\) 从 \(l\) 往下枚举,如果 \(i\) 和 \(i+1\) 所用短竖线情况相等。那么就输出 \(2\) 并结束程序,否则继续枚举直到 \(i\) 和 \(i+1\) 所用短竖线情况相等或 \(i\) 大于 \(r\),输出 \(1\)。
AC CODE
#include <bits/stdc++.h>
using namespace std;
long long l,r;
int f[10]={6,2,5,5,4,5,6,3,7,6};
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>l>>r;
bool ok=0;
for(long long i=l;i<r;i++){
if(i%10==2){ok=1;break;}
if(i%10==9){
long long tmp=i;
while(tmp%10==9){
tmp/=10;
}
if(tmp%10==2){
ok=1;
break;
}
}
}
cout<<(ok?2:1);
return 0;
}