疑问
查看原帖
疑问
569702
_xxy_楼主2022/12/30 20:12

为什么这玩意儿本地编译运行失败,提交可以过……(可能有低级失误没注意到)

#include<cstdio>
#include<algorithm>
inline int read(){
	int x=0,f=1;
	char ac=getchar();
	while(ac<'0'||ac>'9'){
		if(ac=='-') f=-1;
		ac=getchar();
	}
	while(ac>='0'&&ac<='9'){
		x=(x<<3)+(x<<1)+(ac-'0');
		ac=getchar();
	}
	return x*f;
}
inline long long read2(){
	long long x=0,f=1;
	char ac=getchar();
	while(ac<'0'||ac>'9'){
		if(ac=='-') f=-1;
		ac=getchar();
	}
	while(ac>='0'&&ac<='9'){
		x=(x<<3)+(x<<1)+(ac-'0');
		ac=getchar();
	}
	return x*f;
}
int l,r,dp[12][12];
int solve(int x){
	int cnt,ans,a[12];
	cnt=ans=0;
	while(x){
		a[++cnt]=x%10;
		x/=10;
	}
	for(int i=1;i<cnt;i++){
		for(int j=1;j<10;j++){
			ans+=dp[i][j]; //位数小于cnt
		}
	}
	for(int i=1;i<a[cnt];i++){
		ans+=dp[cnt][i];  //位数等于cnt且最高位小于x的最高位 
	}
	for(int i=cnt-1;i>=1;i--){
		for(int j=0;j<a[i];j++){
			if(abs(j-a[i+1])>=2) ans+=dp[i][j];  //从第二位开始递推 
		}
		if(abs(a[i]-a[i+1])<2) break;
		if(i==1) ans++;
	}
	return ans;
}
int main(){
	int l=read(),r=read();
	for(int i=0;i<10;i++){
		dp[1][i]=1;
	}
	for(int i=2;i<=10;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++){
				if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
			}
		}
	}
	printf("%d",solve(r)-solve(l-1));
	return 0;
}
``
2022/12/30 20:12
加载中...