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;
}
posted @ 2024-01-15 22:22  Xu_dh  阅读(27)  评论(0)    收藏  举报