3 条题解

  • 2
    @ 2025-3-28 9:33:55

    注意到有可能答案后面有一堆 00

    所以我们直接判断如果两个数之间差了大于 1000010000 ,那么一定会有一堆 00 ,所以直接除以1000010000 然后暴力跑,最后答案处理一下

    对于答案处理,因为我们需要找到最小值,那么我们可以判断如果答案除以 1010 大于 x1x1 那么我们就一直除下去

    x1=reads(),x2=reads();
    //		cout<<x2-x1<<endl;
    		if(x2-x1<=10000){
    			for(int i=x1;i<=x2;i++){
    				int opt=F(i);
    				if(opt<ans) ans=opt,bns=i;	
    				if(opt==ans) bns=min(bns,i);
    			}
    			printf("%lld\n",bns);
    		}
    		else{
    			int t1=x1;
    			if(x1%10000!=0) x1=x1/10000+1;
    			else x1/=10000;
    			x2/=10000;
    			for(int i=x1;i<=x2;i++){
    				int opt=F(i);
    				if(opt<ans) ans=opt,bns=i;	
    				if(opt==ans) bns=min(bns,i);
    			}
    			bns*=10000;
    			while(bns%10==0&&(bns/10)>=t1) bns/=10;
    			printf("%lld\n",bns);
    		}
    
    • @ 2025-3-28 10:11:15

      放一下wsh没有放的 F(i) 函数

      int F(int x){
      	while(x%10==0) x/=10;
      	int t=x,cnt=0,f=0;
      	while(t){
      		int op=t%10;
      		t/=10;
      		cnt++;
      		if(cnt==1&&op==5) f=1; 
      	}
      	return 2*cnt-f;
      }
      
  • 0
    @ 2025-3-28 9:56:21

    奇怪的函数 题解

    窝觉得窝20pts的无脑解法和AC代码差不多。

    那最基础的想法就是从x1到x2计算一遍,注意答案要求的是f(x) 取到最小值时的最小的整数x,而不是f(x)的最小值。 计算方式看着有点恶心,实则不然。

    优化也比较显然,假如现在是500,那么501,502...这些数都没什么用,直接预处理jump[]跳过这些数字即可。

    CODE

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int T,a,b,id,minn,jump[170];
    inline int read(){
    	int x=0,f=1;
    	char ch=getchar();
    	while(!isdigit(ch)){
    		if(ch=='-')f=-1;
    		ch=getchar();
    	}
    	while(isdigit(ch)){
    		x=(x<<1)+(x<<3)+(ch^48);
    		ch=getchar();
    	}
    	return x*f;
    }
    inline void write(int x){
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+48);
    }
    void init(){
    	jump[0]=1;
    	for(int i = 1;i<=9;i++)
    		jump[i]=jump[i-1]*10;
    }
    int del(int x){
    	int bit=0;
    	while(x%10==0){
    		x/=10;
    		bit++;
    	}
    	return bit;
    }
    int f(int x){
    	int bit=0;
    	while(x%10==0)x/=10;
    	int yu=x%10;
    	while(x){
    		x/=10;
    		bit++;
    	}
    	if(yu==5)return (2*bit-1);
    	return (2*bit);
    }
    signed main(){
    	//freopen("fjy.txt","r",stdin);
    	init();
    	T=read();
    	while(T--){
    		a=read();b=read();
    		minn=0x7f7f7f7f,id;
    		for(int i = a;i<=b;i+=jump[del(i)]){
    			int t=f(i);
    			if(t<minn){
    				id=i;
    				minn=t;
    			}
    		}
    		write(id);putchar('\n');
    	}
    	return 0;
    }
    
    • 0
      @ 2025-3-28 8:36:50

      注意到本题考查了数位 dp,因此我们分块打表就可以了。

    • 1

    信息

    ID
    109
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    119
    已通过
    22
    上传者