CodeForces 204A - Little Elephant and Interval 算答案..易错..暴力打表对拍

      题意:

                找出[l,r]范围内..第一位数字和最后一位数字相同的数的个数...1<=l<=r<=10^18

      题解:

                这个显然要找出一些关系和联系..推出1~(l-1)...与 1~r 的符合条件的个数..后者再减去前者..为了方便处理.先将数字转为字符串..sprintf就好了...举个例子..如要找1~3021内符合条件的个数..3021是长度为4的十进制数..那么把1~3位的所有算进来..一共9+9+10*9=108...在把1000~2999的加进来..2*100...再把千位为3的加进来.由于最有一位小于3..所以要向前借一位..所以有2个..那么答案就是108+200+2=310个...

                 我在写这题的时候就出现了很多细节错误..所以写了个暴力的来对拍..很好使!


Program:

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<string.h>
#include<stack>
#include<queue>
#include<algorithm>
#define oo 1000000007
#define ll long long 
#define MAXN 1000005 
using namespace std;  
char s[25];
ll pow10[20];
ll cnt(ll x)
{     
       int len,i;
       ll ans=0,t,p;
       sprintf(s+1,"%I64d",x);
       len=strlen(s+1);
       for (int i=1;i<len;i++)
       {
             t=i-2;
             if (t<0) t=1; 
                else t=pow10[t];
             ans+=9*t; 
       }  
       if (len-2>=0) t=pow10[len-2];
               else t=1;
       ans+=(s[1]-'1')*t;
       p=0;
       for (i=2;i<len;i++) p=p*10+(s[i]-'0');
       if (s[1]>s[len]) p--;
       ans+=p+1; 
       return ans;
}
int main()
{ 
       freopen("input.txt","r",stdin);
       freopen("output.txt","w",stdout);
       ll l,r;
       pow10[0]=1;
       for (int i=1;i<=18;i++) pow10[i]=pow10[i-1]*10;
       while (~scanf("%I64d%I64d",&l,&r)) 
           printf("%I64d\n",cnt(r)-cnt(l-1)); 
       return 0;
}


你可能感兴趣的:(CodeForces 204A - Little Elephant and Interval 算答案..易错..暴力打表对拍)