DOJ-定价求解,尝试过

描述

在市场上有很多商品的定价类似于 999 元、4999 元、8999 元这样。

它们和 1000 元、5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商家常用的价格策略 。

不过在你看来,这种价格十分荒谬。

于是你如此计算一个价格 p(p 为正整数)的荒谬程度:

首先将 p 看做一个由数字组成的字符串(不带前导 0);

然后,如果 p 的最后一个字符是 0,就去掉它。重复这一过程,直到 p 的最后一个字符不是 0;

记 p 的长度为 a,如果此时 p 的最后一位是 5,则荒谬程度为 2a−1;否则为 2a。

例如,850 的荒谬程度为 3,而 880 则为 4,9999 的荒谬程度为 8。

现在,你要出售一样闲置物品,你能接受的定价在 [L,R] 范围内,你想要给出一个荒谬度最低的价格。

输入描述

第一行包含一个正整数 T,表示测试数据的数目。

每个测试数据占单独的一行,包含两个空格分隔的正整数 L,R,表示定价的区间。

输出描述

对于每个测试数据,在单独的一行内输出结果。

如果荒谬度最低的价格不唯一,输出最小的那个。

用例输入 1

3
998 1002
998 2002
4000 6000
用例输出 1

1000
1000
5000
提示

对于 100% 的数据,

1≤T≤100,

1≤L≤R≤10
9


#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
const int mn = 15;
inline void add(ll &x)
{
    ll tmp = 1;
    while(x % 10 == 0)
        x /= 10, tmp *= 10;
    ++x, x *= tmp;
}
inline ll calc(ll x)
{
    while(x % 10 == 0)
        x /= 10;
    ll i = 1, tmp = 0;
    while(i <= x)
        i *= 10, ++tmp;
    return 2 * tmp - (x % 10 == 5);
}
int main()
{
    int t;
    ll l, r;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%lld%lld", &l, &r);
        ll ans = l;
        for(ll i = l + 1; i <= r; add(i))
            if(calc(ans) > calc(i))
                ans = i;
        printf("%lld\n", ans);
    }
}

参考

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632