#15WA,求调
查看原帖
#15WA,求调
1107998
Flaw_Owl楼主2023/12/25 21:57

我的思路

只有三种情况存在连续数字且竖线数量相等,因此只有两种输出情况:1或者2。2的输出情况有:
1.末位是2和3
2.末两位是29和30
3.299…9和300……0

我使用区间长度能否包含这些数字来判断。判断式可以见代码中的判断条件。

(对手指)确实感觉思路很清奇……正统的方法也已经学会了,就是对为什么我的代码无法AC耿耿于怀()已经测试过大部分能想到的点。希望能有大佬找出我的问题(滑跪)


#15WA的代码

#include <iostream>
#include <string>
#include <cmath>
#define ll long long

using namespace std;

bool special_check(ll l, ll r)
{
	// 找到l的位数。
	string str_l = to_string(l);
	ll n = str_l.size();

	// 例如,l为3位数,就是299和300;l为4位数,就是2999和3000
	ll endpoint = 300 * pow(10,n-3);

	// 判断题目中的l和r能否把299…9和300…0夹在中间
	if (l <= endpoint - 1 && r >= endpoint)
		return true;
	else
		return false;
}

int main()
{
	ll l, r;
	cin >> l >> r;

	ll length = r + 1 - l;
	ll last_digit = l % 10;
	ll last_two_digits = l % 100;

	// 判断1:区间长度为1仅仅包含自己,输出1
	if (length == 1)
		cout << "1" << "\n";

	// 判断2:末位
	else if (last_digit <= 2 && length >= 4 - last_digit)
		cout << "2" << "\n";
	else if (last_digit >= 3 && length >= 14 - last_digit)
		cout << "2" << "\n";

	// 判断3:末两位
	else if (last_two_digits <= 29 && length >= 31 - last_two_digits)
		cout << "2" << "\n";
	else if (last_two_digits >= 30 && length >= 131 - last_two_digits)
		cout << "2" << "\n";

	// 判断4:299…9和300…0
	else if (special_check(l, r))
		cout << "2" << "\n";

	// 都不符合的情况
	else
		cout << "1" << "\n";

	return 0;
}
2023/12/25 21:57
加载中...