蓝桥杯真题——稍大的串

标题:稍大的串

  串可以按照字典序进行比较。例如:

  abcd 小于 abdc

  如果给定一个串,打乱组成它的字母,重新排列,可以得到许多不同的串,在这些不同的串中,有一个串刚好给定的串稍微大一些。科学地说:它是大于已知串的所有串中最小的串。你的任务就是求出这个“稍大的串”。

例如:

输入串:

abfxy

程序应该输出:

abfyx

 

再例如:

输入串:

ayyyxxff

程序应该输出:

fafxxyyy

 

数据规模约定:

  输入的串不超过1000个字符。

特例:

  如果已知的串已经是所有重组串中最大的,则原样输出读入的那个串。

/*

找到某个排列的下一个相邻排列

比本排列大的所有排列中,选字典序最小的

 

1. 逆向搜索一对相邻的元素,[x1,x2] 满足 [x1] < [x2], 若失败,则不存在下一个排列(本排列最大)

2. 逆向搜索一个元素 [y] 满足 [y]>[x1], 显然,最坏情况下,x2就是y,所以一定能找到

3. 交换: [x1] <--> [y]

4. [x2,...] x2以后的序列翻转

*/

import java.util.*;



public class Main

{

static boolean f_next(char[] a)

{

int x1 = -1;

for(int i=a.length-1; i>0; i--)

{

if(a[i-1]<a[i])

{

x1 = i-1;

break;

}

}



if(x1<0) return false;



int x2 = x1 + 1;

int y = -1;



for(int i=a.length-1; i>0; i--)

{

if(a[i]>a[x1])

{

y = i;

break;

}

}



{char t = a[x1]; a[x1] = a[y]; a[y] = t;}



y = a.length-1;

while(true)

{

if(x2>=y) break;

char t = a[x2];

a[x2] = a[y];

a[y] = t;

x2++;

y--;

}



return true;

}



public static void main(String[] args)

{

Scanner sc= new Scanner(System.in);



char[] a = sc.nextLine().trim().toCharArray();





f_next(a);

for(int i=0; i<a.length; i++){

System.out.print(a[i]);

}

System.out.println();

}

}

 

### Python蓝桥杯学B组历年真题 以下是关于Python语言在蓝桥杯学B组中的部分历年真题及其解析: #### 题目1:字符排序 题目描述:输入一个字符,将其按照字母顺序从小到排列并输出。 代码实现如下: ```python a = input() b = [] for i in a: b.append(i) b.sort() print("".join(str(s) for s in b)) ``` 此代码实现了对输入字符的字符逐一读取、存储至列表 `b` 中,并通过调用 `.sort()` 方法完成排序操作[^1]。最终利用 `" ".join(...)` 将排序后的字符重新组合成字符形式输出。 --- #### 题目2:判断闰年 题目描述:给定某一年份,判断其是否为闰年。如果该年份满足条件,则返回 True;否则返回 False。 代码逻辑分析: - 判断规则遵循公历规定:“四年一闰,百年不闰,四百年再闰”。具体而言,当且仅当年份数字能够被 4 整除而不能被 100 整除或者能被 400 整除时,这一年才是闰年。 代码实现如下: ```python def is_leap_year(year): if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): return True else: return False # 测试样例 test_years = [2000, 2100, 2024] results = {year: is_leap_year(year) for year in test_years} print(results) ``` 上述函数定义了一个用于检测指定年份是否属于闰年的方法 `is_leap_year`,并通过测试数据验证了其实现效果[^2]。 --- #### 题目3:动态规划问题——最价值子序列 题目描述:给出一组数值权重数组以及对应的约束关系矩阵,求解使得总权值最的合法子序列长度。 核心思路在于采用二维动态规划表记录中间计算过程的状态转移方程。设 `dp[i][j]` 表达的是考虑前 i 项元素情况下选取与否对应的最收益情况,则状态更新公式可表示为: - 不选择当前项目:`dp[i][0] = max(dp[i-1][0], dp[i-1][1])` - 选择当前项目但需跳过紧邻前者:`dp[i][1] = dp[i-1][0] + wi` 其中变量含义分别为: - `i`: 当前所处理的数据索引位置; - `wi`: 对应于第 i 位上的实际贡献量小[^3]。 完整程序框架示意如下所示: ```python n = int(input()) # 输入物品数量 n weights = list(map(int, input().split())) # 权重向量初始化 dp = [[0]*2 for _ in range(n)] # 动态规划表格分配空间 for idx in range(1, n): # 自底向上填充 DP 数组 dp[idx][0] = max(dp[idx-1][0], dp[idx-1][1]) dp[idx][1] = dp[idx-1][0] + weights[idx] result = max(dp[-1][0], dp[-1][1]) # 取全局最优方案作为结果输出 print(result) ``` 以上展示了如何运用动态规划技巧解决特定场景下的最优化难题实例之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值