题目传送门

题目描述

Jam 是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。

在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为 Jam 数字。在 Jam 数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam 还指定使用字母的范围,例如,从2∼10,表示只能使用 b,c,d,e,f,g,h,i,j 这些字母。如果再规定位数为 5,那么,紧接在 Jam 数字bdfij 之后的数字应该是 bdghi。(如果我们用 U 、 V 依次表示 Jam 数字 bdfij 与 bdghi,则 U<V,且不存在 Jam 数字 P,使 U<P<V)。

你的任务是:对于从文件读入的一个 Jam 数字,按顺序输出紧接在后面的 5 个 Jam 数字,如果后面没有那么多 Jam 数字,那么有几个就输出几个。

输入格式

共 2 行。

第 11 行为 3 个正整数,用一个空格隔开:s,t,w。

(其中 s 为所使用的最小的字母的序号,t 为所使用的最大的字母的序号。w 为数字的位数,这 3 个数满足:1≤s<T≤26,2≤w≤t−s

第 2 行为具有 w 个小写字母的字符串,为一个符合要求的 Jam 数字。

所给的数据都是正确的,不必验证。

输出格式

最多为 5 行,为紧接在输入的 Jam 数字后面的 5 个 Jam 数字,如果后面没有那么多 Jam 数字,那么有几个就输出几个。每行只输出一个 Jam 数字,是由 w 个小写字母组成的字符串,不要有多余的空格。

输入输出样例

输入样例 #1

  2 10 5bdfij

输出样例 #1

bdghi
bdghj
bdgij
bdhij
befgh

解题思路:

题目的大致意思是给定我们一个字符串,让我们输出所有比它大的字符串中最小的那一个,并且每一个数位上的数最大不能超过小写字母中的第t个,最小不能低于第s个。那我们要想比原Jam数大,又要最大中的最小,我们可以从后向前改,对吧!

比如说一个数:13468

我们要想把它改成一个比它大的数,又要最小

如果从前向后改:23468

如果从后向前改:13469

显然从后向前改是最优解。

OK,第一个问题解决了,还有第二个问题,它最大的数是有限制的。

拿上面的举例,13468能改成13469。

那如果最大不能超过8呢?

这个答案就明显是错误的。

正确的做法:

1.枚举到88+1=99大于8,减回去。

2.枚举到44+1=5,5<=8,退出循环。

所以最终的答案就是 13458                                                                                                 .............吗?

还是.............................................................................................................................................13456?

显而易见,把一个数改成 x 后还得从 x+1 开始改后面的数。

还有几个像严格递增的注意点自己考虑一下。

配合代码讲。

一、读入:

scanf("%d%d%d%s",&s,&t,&w,jam+1);

jam+1表示数组从 jam[1] 开始读,到 jam[w] 结束。

二、设置字母使用范围:

s1='a'+s-1;
t1='a'+t-1;

s1表示字母的最小使用范围,t1表示字母使用的最大范围。

三、找到第一个可变大的数位,

int j=w;
while(j>=1)
{jam[j]++;if(jam[j]>t1||jam[j]==jam[j+1]){jam[j]--;j--;}else{break;}
}

jam[j]==jam[j+1]表示有相同就必须改(题目要求没有相同的数位)。

四、往后改,原因向上翻。

j++;
for(char k=jam[j-1]+1;k<=t1;k++)
{if(k<jam[j]){jam[j]=k;j++;}
}

最后别忘了枚举 1~5

AC code:

#include<iostream>
#include<cstdio>
using namespace std;
int s,t,w;
char jam[30],s1,t1;
int main()
{scanf("%d%d%d%s",&s,&t,&w,jam+1);s1='a'+s-1;t1='a'+t-1;
//  printf("%c %c\n",s1,t1);for(int i=1;i<=5;i++){int j=w;while(j>=1){jam[j]++;if(jam[j]>t1||jam[j]==jam[j+1]){jam[j]--;j--;}else{break;}}j++;for(char k=jam[j-1]+1;k<=t1;k++){if(k<jam[j]){jam[j]=k;j++;}}printf("%s\n",jam+1);}return 0;
}

The end.

【NOIP2006 普及组】T3 Jam 的计数法 题解相关推荐

  1. Jam的计数法 题解

    JamJamJam的计数法 题解 题目 题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...

  2. 信息学奥赛一本通 1184 | 1934:【06NOIP普及组】明明的随机数 | OpenJudge NOI 1.10 09 | 洛谷 P1059 [NOIP2006 普及组] 明明的随机数

    [题目链接] ybt 1184:明明的随机数 ybt 1934:[06NOIP普及组]明明的随机数 OpenJudge NOI 1.10 09:明明的随机数 洛谷 P1059 [NOIP2006 普及 ...

  3. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  4. 信息学奥赛一本通 1937:【06NOIP普及组】数列 | 洛谷 P1062 [NOIP2006 普及组] 数列

    [题目链接] ybt 1937:[06NOIP普及组]数列 洛谷 P1062 [NOIP2006 普及组] 数列 [题目考点] 1. 数制 [解题思路] 如果k为2,那么这个数列 第1项为202^02 ...

  5. 洛谷P1061 Jam的计数法 数学

    洛谷P1061 Jam的计数法 数学  已知一个字符串 其 均有 s--t构成 且字符串要求 s[ i ]<s[ j ] i < j 已知一个字符串 求按字典序排列 的后5个字符串 1. ...

  6. 洛谷——P1059 [NOIP2006 普及组] 明明的随机数

    P1059 [NOIP2006 普及组] 明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了NN个11到10001000之间的随机整数(N≤100 ...

  7. 洛谷P1059 [NOIP2006 普及组] 明明的随机数

    题目链接: [NOIP2006 普及组] 明明的随机数 洛谷P1059 [NOIP2006 普及组] 明明的随机数 目录 洛谷P1059 [NOIP2006 普及组] 明明的随机数 1.题目 > ...

  8. 【10.28 校内普及组】 小B浇花 题解

    [10.28 校内普及组] 小B浇花 题解 题目 解题思路 排个序 如果当前的高度小于等于上一个 答案累加上一高度-当前高度+1 代码 #include<algorithm> #inclu ...

  9. SDNU 1176.Jam的计数法(思维)

    Description Jam不使用阿拉伯数字计数,而是使用小写英文字母计数.他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母.我 ...

最新文章

  1. 我什么时候应该使用结构而不是类?
  2. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御
  3. spring中Converter如何注入的
  4. vc++6.0获取磁盘基本信息_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息...
  5. Openstack部署工具
  6. 印度市场,圆不了二线国产手机的美梦
  7. UVA - 1587 Box
  8. 链表之打印两个有序链表的公共部分
  9. Valhalla项目的价值
  10. 433M数传电台窄带无线通讯技术手册
  11. strlen和sizeof的长度区别
  12. aws rds监控慢sql_估算AWS RDS SQL Server成本
  13. dp hp oracle 备份软件_HPDP备份软件设置
  14. C++SOCKET面试题附答案
  15. 魔方口诀(个人备忘)
  16. web网页设计期末课程大作业~超高仿英雄联盟LOL游戏官网设计与实现(HTML+CSS+JavaScript)
  17. 2014522420145238 《信息安全系统设计基础》第二次实验
  18. 用photoshop制作证件照片
  19. Linux常用打包命令
  20. 编译原理 —— 逆波兰式

热门文章

  1. 第一行代码 Android读书笔记(二)
  2. html 网页 简体中文 繁体中文 英文自适应,css页面字体替换源代码和页面显示不一样问题解决...
  3. 计算机丢失quartz.dll什么意思,电脑系统提示没有找到quartz.dll该怎么办
  4. 做公关就是做产品:新媒体时代的公关怎么做
  5. 大厂程序员裸辞全职接单一个月,感触颇多!
  6. web前端编辑所见即所得
  7. Arduino驱动直流电机风扇
  8. GPS 卫星的信号结构
  9. linux下LPC访问CPLD
  10. 引用SMTH的一个“坑”!