蓝桥杯算法训练VIP-JAM计数法

题目

题目链接

题解

这道题有点类似于“加法”,给你一个数x,输出x+1x+2x+3x+4x+5

(为了下述方便,我们直接将字母表示为数字,1a以此类推)
同样也存在进位,因为要求每个位置上的数最大不能超过t,而且还要求必须递增,这就导致每一个位置都对应一个允许的最大数,第i位能放的最大数为t+i-w+1i = 1~w-1。(自己举几个i就知道了)

为了方便,我们暂设第i位能放的最大数为mx[i]
对最高索引位的数+1,当最高索引位的数大于其对应的mx时,就说明要发生进位,那么次高索引位的数就要+1,再将此数与此位对应的mx进行比较,依次向低索引位推进,直至不发生进位或者到头了。若到头了,说明已经不存在一个满足要求且比当前这个数大的数了;若未到头,中途存在某位得到后面的进位后仍不进位,则让停到的这一个位置上的数+1,其后面的每一位数都赋值为其前一位数的值+1,即第i位的数赋值为第i-1位的数+1,而停到的这一位前面是的数不变,输出即可。

我们按照上面的方式输出五次,或者到头了直接break。

代码

#include<bits/stdc++.h>
using namespace std;

int s, t, w;
char str[100];

int main()
{
	cin>>s>>t>>w>>str;
	for(int c = 1;c <= 5;c ++) { // 遍历五次,输出五个 
		int cc = 1, i = w-1; // cc进位 
		for(;i >= 0;i --) {
			if(str[i]-96+cc > t+i-w+1) cc = 1; // t+i-w+1表示第i位能放的最大字母是多少,要是当前这个字母加上进位大于了本位能放的最大字母,就要发生进位 
			else cc = 0;
			if(cc==0) break; // 进位为0,说明第i位不用再向前进位了 
		}
		if(i!=-1) {
			str[i] = str[i]+1; // 第i个数+1 
			for(int j = i+1;j < w;j ++) str[j] = str[j-1]+1; // 后面的数依次比前一个大1 
			cout << str << endl;
		} else break; // 连第一个都要向前进位了则说明之后没有字符串比它大了 
	}
	
		
	return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不牌不改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值