当前位置: 代码迷 >> 综合 >> Little Elephant and Interval CodeForces - 205C
  详细解决方案

Little Elephant and Interval CodeForces - 205C

热度:59   发布时间:2024-02-07 13:45:14.0

早训的题终于做出来了
对照着cf的数据改了一年 不然估计够呛
感觉细节还是太差了
而且模拟的时候过程也没想清楚
有点想当然地感觉 一写就是bug
有点头疼 幸好cf给了数据

题目思路

题目要求l到r之间有多少个数字的首尾想同
第一眼感觉像是数位dp
但是有点不记得怎么写了 就想着模拟
但其实思路跟数位dp差不多
把求l到r的区间转换成求1到r的区间减去1到l-1的区间

ac代码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include  <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 10000+5;
const int inf = 0x3f3f3f3f;
const ll llinf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1000000007;
//998244353int a[20],b[20];
ll pow(int a,int b)
{ll tema=1;for(int i=1;i<=b;i++)tema*=10;return tema;
}int main()
{ll l,r;scanf("%I64d%I64d",&l,&r);l--;ll teml=l,temr=r,suml=0,sumr=0;ll ansl=0,ansr=0,tem=1;while(teml)//计算l-1的数位并记录每一位上的数值{suml++;a[suml]=teml%10;teml/=10;}if(l<10)//小于十的时候直接特判ansl=l;else{//print1;ansl+=9;for(ll i=suml-2;i>=1;i--){ansl+=9*pow(10,i-1);}ansl+=(a[suml]-1)*pow(10,suml-2);for(ll i=suml-1;i>=1;i--){if(i==1){if(a[1]>=a[suml]){//printf("%d %d\n",a[1],a[suml]);ansl++;}}elseansl+=a[i]*pow(10,i-2);}//ansl+=tem;}while(temr){sumr++;b[sumr]=temr%10;temr/=10;}if(r<10)ansr=r;else{ansr+=9;for(ll i=sumr-2;i>=1;i--){ansr+=9*pow(10,i-1);}ansr+=(b[sumr]-1)*pow(10,sumr-2);ll tem;tem=1;for(ll i=sumr-1;i>=1;i--){if(i==1){if(b[1]>=b[sumr]){ansr++;//printf("%d %d\n",b[1],b[sumr]);}}elseansr+=(b[i])*pow(10,i-2);}//ansr+=tem;}printf("%I64d\n",ansr-ansl);}
  相关解决方案