题意:输入一个n,求从中任选两个数,使得其尾部9的个数最多的数对有多少个。(也可能存在0个9) n ≤ 10^9

例:n=14:1 and 8;2 and 7;3 and 6;4 and 5;5 and 14;6 and 13;7 and 12;8 and 11;9 and 10。

思路:刚开始我是想找规律的,然后发现规律是有的,太难表述出来了。看了别人的题解知道,这应该从另一角度来思考,比如最多的9的个数是2,那么就要构造出99,199,299,…,899,考虑满足和是这些的数对有几个,然后发现自己读错题了…是可以出现一个数被选多次的…

以两个9为例:

99:1+98…49+50——50~98都可以凑出99

199——100~198都可以凑出199

……

899——450~898都可以凑出899

然后就可以写了,注意特判2~4。

代码:

int main()
{
    long long n;
    scanf("%lld",&n);
    int num=0;//9的最大个数
    long long zs=5;
    if(n<=4)
    {
        if(n==2)printf("1\n");
        else if(n==3)printf("3\n");
        else if(n==4)printf("6\n");
        return 0;
    }
    for(int i=1;i<=9;i++)
    {
        if(n<zs)break;
        zs=zs*10;num++;
    }
    //printf("num=%d\n",num);
    long long l=5;long long r=10;
    for(int i=0;i<num-1;i++)
        l=l*10,r=r*10;
    long long sl=l,sr=r;
    r=r-2;
    long long ans=0;
    for(int i=0;i<9;i++)
    {
        if(n<l)break;
        else if(n>=r)ans+=r-l+1;
        else if(n>=l)ans+=(n-l)+1;
        l=l+sl;r=r+sr;
    }
    printf("%lld\n",ans);
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

CodeForces899E 模拟链表+优先队列+pair Previous
POJ3784 动态插入求中位数 Next