1 solutions

  • 0
    @ 2024-12-2 21:29:19

    首先分类讨论。

    如果 k=0k=0 ,枚举每个第一类好数,找到第一个 x \leq x 的God数。

    如果 k=1k=1 ,注意这 t1t−1 个数不一定连续(其实只要明白这一点就可以了),只需要枚举与其他不同的那个数位的位置,并枚举与其他不同的那个数位的数字与其他的数位的数字,并不断更新答案,就能得到解(说白了就是枚举每个第二类God数)。

    #include<bits/stdc++.h>
    using namespace std;//代码里用A代表与其他不同的那个数位,X代表除A外其他的数位
    int ws(long long x){//求x的位数
    	int k=0;
    	for(;x;x/=10)k++;
    	return k;
    }
    int main(){
    	int k,t;long long x;bool flag;//定义变量(不开long long见祖宗)
    	cin>>x>>k;t=ws(x);//下面是重点
    	if(k==0){//分类讨论1
    		for(int X=1;X<=9;X++){//枚举X
    			long long now=0;//now代表当前正在枚举的好数 
    			for(int i=1;i<=t;i++)now=now*10+X;//求出这个好数
    			if(now>=x){//如果好数不小于输入的数
    				cout<<now;
    				return 0;//输出并结束
    			}
    		}
    	}else{//分类讨论2
    		long long ans=1e17;//ans代表所有now中的最优解(由于要求min请开1e17) 
    		for(int X=0;X<=9;X++)
    			for(int A=0;A<=9;A++)
    				for(int k=1;k<=t;k++){
    					if(X==0&&k!=1)continue;
    					if(A==0&&k==1)continue;//排除有前导0的数
    					long long now=0;//now代表当前正在枚举的好数
    					for(int i=1;i<k;i++)now=now*10+X;//加上A的位置的前面的数位 
    					now=now*10+A;//加上A的数位 
    					for(int i=k+1;i<=t;i++)now=now*10+X;//加上A的位置的后面的数位
    					if(now>=x)ans=min(ans,now);//计算最优解 
    				}
    		cout<<ans;
    		return 0;//输出并结束
    	}
    }
    
    • 1

    Information

    ID
    617
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    (None)
    # Submissions
    77
    Accepted
    2
    Uploaded By