一、题目描述:
游游拿到了一个字符串,她希望你进行以下操作:
操作1:输入1 x y
代表删除字符串的第x
个字符到第y
个字符。
操作2:输入2 x str
代表将字符串str
插入到第x
个字符的后面。
请你输出最终生成的字符串。
输入描述
第一行输入一个字符串 s,代表初始的字符串。
第二行输入一个正整数 q,代表操作次数。
接下来的 q 行,每行输入一行指令1 x y或者2 x str。
1 ≤ len(s), q ≤1000
保证输入的指令均合法,即 x,y 一定不超过当前字符串的长度。
操作2的 x 可能是0,代表将字符串 str 作为前缀插入字符串。
所有 str 的长度之和不超过3000。
输出描述
输出一行字符串,代表操作结束后的字符串。若字符串为空,则输出-1。
示例1
输入
abcde
3
1 2 4
2 1 rca
2 5 a
输出
arcaea
说明:
第一次操作后,字符串变成"ae"。
第二次操作后,字符串变成"arcae"。
第三次操作后,字符串变成"arcaea"。
参考答案:
public class XC1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取初始字符串
StringBuilder str = new StringBuilder(scanner.nextLine());
// 读取操作次数
int q = scanner.nextInt();
scanner.nextLine(); // 处理剩余的换行符
// 处理每个操作
for (int i = 0; i < q; i++) {
String line = scanner.nextLine();
String[] parts = line.split(" ");
switch (parts[0]) {
case "1": // 操作1: 删除字符
int x = Integer.parseInt(parts[1]);
int y = Integer.parseInt(parts[2]);
// 注意:实际的字符串索引从0开始,所以我们减1
str.delete(x - 1, y);
break;
case "2": // 操作2: 插入字符串
int position = Integer.parseInt(parts[1]);
String insertStr = parts[2];
// 如果position为0,我们在字符串前插入,否则在指定位置后插入
str.insert(position == 0 ? 0 : position, insertStr);
break;
}
}
scanner.close();
// 如果字符串为空,输出-1,否则输出字符串
if (str.length() == 0) {
System.out.println("-1");
} else {
System.out.println(str.toString());
}
}
}
二、题目描述:
游游非常喜欢旅游。她每年会选出 n 个备选的旅游方案,每个方案的目的地为一个城市。
现在给出每个方案的目的城市以及游游对该方案的期待值。
如果在这一年中第一次选择某城市,那么该方案的期待值会翻倍。
已知游游准备选择其中的个方案,使得总期待值尽可能高。你能帮游游求出最大的期待值之和吗?
输入描述
第一行输入两个正整数 n , k ,代表方案总数以及游游可选的方案数量。
接下来的 n 行,每行输入两个正整数 ai和 bi,代表该方案的目的城市为 ai ,期待值为 bi。
1≤ k ≤ n ≤10^5
1≤ ai , bi ,≤10^9
输出描述
一个整数,代表最终的最大期待值之和。
示例1
输入
4 3
1 5
1 6
1 7
3 8
输出
36
说明:
首先选择第3个方案,前往1号城市。由于是第一次选择1号城市,期待值翻倍,获得14期待值。
然后选择第2个方案,获得6期待值。
最后选择第4个方案,前往3号城市。由于是第一次选择3号城市,期待值翻倍,获得16期待值。
参考答案:
public class XC2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 方案总数
int k = scanner.nextInt(); // 可选方案数量
Map<Integer, List<Integer>> d = new HashMap<>();
for (int i=0;i<n;i++){
int x = scanner.nextInt();
int y = scanner.nextInt();
if(!d.containsKey(x)){
d.put(x, new ArrayList<>());
}
d.get(x).add(y);
}
List<Integer> a = new ArrayList<>();
for (int i: d.keySet()){
List<Integer> list = d.get(i);
Collections.sort(list, Collections.reverseOrder());
a.add(list.get(0)*2);
for (int j = 1;j<list.size();j++){
a.add(list.get(i));
}
}
Collections.sort(a,Collections.reverseOrder());
long sum = 0;
for (int i=0;i<k;i++){
sum += a.get(i);
}
// 输出最大期待值之和
System.out.println(sum);
}
}
三、题目描述:
游游拿到了一个整数。她希望截取其中的一段,使得这一段代表的整数是72的倍数。游游想知道,共有多少种不同的截取方案?
截取的方案必须是一个合法的整数,即不允许出现前导零。
输入描述
一个正整数 n 。
1≤ n ≤10^100000
输出描述
合法的截取方案数。
示例1
输入
1440
输出
3
说明
共有3种方案:"1440","144","0",这三种截取方案都是合法的。
示例2
输入
10072
输出
3
说明:
有三种截取方案:
截取一个"0",有两种方案都可以截取到"0"(第二个或者第三个数位)
截取“72”,有一种方案可以做到(截取后两位)。
参考答案:
public class XC3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int n = s.length();
int[][] dp = new int[n][72];
int ans = 0;
for (int i = 0; i < n; i++) {
if (s.charAt(i) != '0') {
dp[i][Integer.parseInt(String.valueOf(s.charAt(i)))] += 1;
} else {
ans += 1;
}
if (i == 0) continue;
for (int j = 0; j < 72; j++) {
dp[i][(j * 10 + Integer.parseInt(String.valueOf(s.charAt(i)))) % 72] += dp[i - 1][j];
}
ans += dp[i][0];
System.out.println(ans);
}
}
}