其他分享
首页 > 其他分享> > AcWing 1912. 里程表

AcWing 1912. 里程表

作者:互联网

题意

给定\(x\)和\(y(x \le y)\),计算满足大于等于\(x\)并且小于等于\(y\)的数的有趣数的个数。称一个数有趣当该数字满足:

数据范围

\(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