B 独一无二 HUNNU校赛题题解

本文介绍了一种简化算法,用于校赛中判断数字序列的递增填充技巧,通过判断首位并填充,避免冗长检查,节省时间。作者分享了从复杂遍历到高效策略的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本题为校赛第二题,要满足两个条件,一个就是新数字必须大于或者等于老数字,第二个就是要保证数字全部相同,例如 111 22222

刚开始我是这样想的,我先判断这个数字是否全部数字一样,可以写一个函数,可以利用除10余10的方法把每一个数位都获取,最后判断是否是全部数字一样,如果一样直接输出,如果不一样则再加一再判断,满分60,我得了55,最后一个时间超了,我想会不会有更加简便的办法呢?还真被我想出来了。

我输入一个数 比如 2549 此时 只有两种可能性 就是 2222 3333
而且这两种可能性还都是和原数据数位一致。可以把数字的第一位读取下来,
再进行填充,就拿上面的例子来说,2549,第一位是 2,填充后为 2222,2222比2549小,则表明2222这个数字2549已经错过,所以必然是3333,此时只要连着输出4个3就可以了,否则就输出刚才得到的2222就可以了。但是个位数时会出错,直接个位数按原位输出即可。

代码如下


#include<iostream>
using namespace std;

int main(){
	int n;
	cin>>n;
	int a;
	int length = 0;
	int b = 0;
	
	while(n--){
		length = 0; 
		b = 0;   // 保证每次循环数字重置
		cin>>a;
		if(a <= 9 ) {  // 个位数特殊情况
			cout<<a<<endl;
			continue;
		}
		int d = a;   // 保存原来的数据 以便和填充数进行比较
		while(1){
			a = a/10;
			length++;   // 循环求位数和第一位的值
			if(a<10) break;
		}
		length++; //  由于求第一位 第一位没除10 所以求位数还要加1
	    
	    int first = a;    // 求出第一位
	    
	    for(int i=0;i<length;i++){
	    	b = 10*b+first;  // 进行填充
	    
		}
	
		if(d>b){    // 如果填充数比原数小 则已经错过 直接输出位数个加一值即可
			for(int i=0;i<length;i++){
				cout<<first+1;
			}
			cout<<endl;
		}
		else{   // 如果填充数比原数大 则未错过 则直接输出即可
			cout<<b<<endl; 
		}
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值