讨论 / C语言实现及解题思路。
每日一题 2018-02-15 23:22:53
点我顶贴 收藏 删除
#include <stdio.h>

#define TIME 5

//============================

int main(void)

{

int s, t, w;

// du qu shu ru.//

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

char arr[w+1];

scanf("%s", arr);

// kai shi shu chu.//

int i, j, k;

for (i = 0; i < TIME; i++) {

for (j = w-1; j >=0; j--) {

if (arr[j]+1 <= ('a'+(t-(w-j)))) {

arr[j] += 1;

for (k = j+1; k < w; k++)

arr[k] = arr[j] + (k-j);

printf("%s\n", arr);

break;

}

}

}

return 0;

}

#1 每日一题@2018-02-15 23:32:56
回复 删除
从题目中可以知道这个JAM是用五位字母来表示一个数字,且这个字母序列是从左到右严格递增排列的。

题目又说会给定可以使用的字母范围,例如 b-j---b c d e f i j。从这个字母序列的最右边截取五位字母也就会得到最后的不可以再进位的JAM,例如 defig,这就是最后的一个JAM数,在这个数之后就不存在JAM数了。

因此我们可以通过“从右到左”依次比较给的JAM与标准JAM数上的字母确定是否能得到下一个JAM数。

例如,JAM数 bdfij, 对于这个JAM数的最后一位 j,与给定范围的最后一个相同,无法进位,所以找 j前面的字母。倒数第二位i与给定范围的倒数第二个也相同,因此也无法进位。倒数第三位f也是,倒数第四位 d与给定范围的倒数第四位 e不同,因此找到了可以进位的地方。--此时将 f用e 替代,然后再将原 f 之后的字母挨个用 e 之后的字母替代,然后输出字符串。

查看更多回复
提交回复