Loading [MathJax]/extensions/tex2jax.js

P2110:欢总喊楼记题解

神仙做法

我看题解之后非常心塞,竟然不用数位 DP !我们先来考虑部分解。当\(num<10\)时,答案就是\(num\)。如果\(num \geq 10\),那么答案就是\(9+\frac{x}{10}\)。我们来看,考虑一个数\(1921\)的答案,我们可以考虑\(192-\)部分里有\(\lfloor \frac{1920}{10} \rfloor\)对首尾相同的数。然后再加上位数为一时的答案。

我们还要考虑,如果\(num\)的最高位大于最低尾,那么答案就要减一。比如,数字\(62\)就需要进行额外考虑,因为表面上第二位有\(6\)对首位相同的数字,其实不然,因为\(66>62\),所以需要排除这个可能。

代码如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// P2110.cpp
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll L, R;
ll dp[20][20][20];
ll query(ll num)
{
if (num <= 9)
return num;
ll sum = 9 + num / 10;
ll inner = num % 10;
ll highest = num;
while (highest >= 10)
highest /= 10;
if (highest > inner)
sum--;
return sum;
}
int main()
{
scanf("%lld%lld", &L, &R);
printf("%lld", query(R) - query(L - 1));
return 0;
}
// P2110.cpp #include <iostream> #include <cstdio> #define ll long long using namespace std; ll L, R; ll dp[20][20][20]; ll query(ll num) { if (num <= 9) return num; ll sum = 9 + num / 10; ll inner = num % 10; ll highest = num; while (highest >= 10) highest /= 10; if (highest > inner) sum--; return sum; } int main() { scanf("%lld%lld", &L, &R); printf("%lld", query(R) - query(L - 1)); return 0; }
// P2110.cpp
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll L, R;
ll dp[20][20][20];

ll query(ll num)
{
    if (num <= 9)
        return num;
    ll sum = 9 + num / 10;
    ll inner = num % 10;
    ll highest = num;
    while (highest >= 10)
        highest /= 10;
    if (highest > inner)
        sum--;
    return sum;
}

int main()
{
    scanf("%lld%lld", &L, &R);
    printf("%lld", query(R) - query(L - 1));
    return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *