AcWing 1912. 里程表
作者:互联网
题意
给定\(x\)和\(y(x \le y)\),计算满足大于等于\(x\)并且小于等于\(y\)的数的有趣数的个数。称一个数有趣当该数字满足:
- 除去前导零以外的所有数字中,除了一个数字不同以外,其他所有数字都是相同的,那么这个数就是“有趣的”。
- 例如,33323 和 110 是有趣的,而 9779 和 55555 不是有趣的。
数据范围
\(100\le X \le Y \le 10^{16}\)
解题思路
计算发现在\(1 \sim 1e16\)满足条件的有趣数有大概有2e4个,所以可以逆向思维,构造所有的数,然后判断是否在\(x\) 和 \(y\) 之间。
因为在构造数字的时候不需考虑数字大小,因此枚举时不需按照数字大小枚举,枚举的思路是先枚举位数,再枚举第一个数字,再枚举第二个数字(两个数字不同),再枚举不同的那个数字的位置,然后构造数字,判断是否题目要求的范围内,记录答案数。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll x, y;
int res;
int main()
{
scanf("%lld%lld", &x, &y);
for(int i = 3; i <= 17; i ++){
for(int j = 0; j < 10; j ++){
for(int k = 0; k < 10; k ++){
if(j != k){
for(int u = 0; u < i; u ++){
string s(i, '0' + j);
s[u] = '0' + k;
if(s[0] != '0'){
ll tmp = stoll(s);
if(tmp >= x && tmp <= y) res ++;
}
}
}
}
}
}
printf("%d\n", res);
return 0;
}
标签:le,数字,里程表,int,include,枚举,有趣,1912,AcWing 来源: https://www.cnblogs.com/bxhbxh/p/16321669.html