题目一:序列变换
题目背景
小易面对一个长度为n的整数序列a_1,...,a_n,需要执行一系列操作来生成一个新的序列b。具体操作如下:
1. 将a_i添加到b的末尾。
2. 反转b序列。
任务是计算并输出经过n次上述操作后b序列的状态。
输入说明
输入包含两行数据,首行为一个整数n(2 ≤ n ≤ 2*10^5),表示序列的长度;次行为n个整数a_i(1 ≤ a_i ≤ 10^9),表示序列a中的元素,各元素间以空格分隔。
输出说明
在一行中输出最终的b序列,各元素间以空格分隔,行末无多余空格。
解析:
输入长度n | 输出序列b |
1 | a0 |
2 | a1 a0 |
3 | a2 a0 a1 |
4 | a3 a1 a0 a2 |
5 | a4 a2 a0 a1 a3 |
6 | a5 a3 a1 a0 a2 a4 |
从上表可以看出规律:
当n为奇数时,先输出a中所有偶数下标的元素(逆序),随后输出所有奇数下标的元素(正序)。反之,当n为偶数时,先输出所有奇数下标的元素(逆序),再输出所有偶数下标的元素(正序)。
下面是实现这一逻辑的Java代码示例:
import java.util.Scanner;
public class SequenceTransform {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] array = new int[n];
for (int i = 0; i array[i] = scanner.nextInt();
if (n % 2 == 0) {
for (int i = n - 1; i >= 0; i -= 2)
System.out.print(array[i] + " ");
for (int i = 0; i System.out.print(array[i] + " ");
System.out.print(array[n - 2]);
} else {
for (int i = n - 1; i >= 0; i -= 2)
System.out.print(array[i] + " ");
for (int i = 1; i System.out.print(array[i] + " ");
System.out.print(array[n - 2]);
}
System.out.println();
}
}
}
题目二:生存天数计算
题目背景
小易拥有f个水果和d元钱,每天需要消费x元租金和1个水果。市场上的水果价格为p元/个。请计算小易最多能维持多少天。
import java.util.Scanner;
public class SurvivalDays {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int fruits = scanner.nextInt();
int mOney= scanner.nextInt();
int rent = scanner.nextInt();
int fruitPrice = scanner.nextInt();
if (money / rent <= fruits)
System.out.println(money / rent);
else
System.out.println((money - fruits * rent) / (rent + fruitPrice) + fruits);
}
}
}
题目三:疯狂队列的最大差值
题目背景
给定一个数组,通过任意排列数组元素,使所有相邻两个元素之间的差值之和达到最大。求解这个最大差值,即所谓的“疯狂值”。
输入说明
输入分为两行,第一行为一个整数n(1 ≤ n ≤ 50),表示数组的大小;第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示数组的具体数值。
输出说明
例如,对于输入序列5 10 25 40 25,若队列排列为25-10-40-5-25,则身高差绝对值的总和为15+30+35+20=100,这即为可能的最大疯狂值。
import java.util.Arrays;
import java.util.Scanner;
public class MaxCrazyValue {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] heights = new int[n];
for (int i = 0; i heights[i] = scanner.nextInt();
Arrays.sort(heights);
int result = 0, altResult = 0;
int mid = n / 2;
if (n % 2 == 0) {
for (int i = 0; i result += 2 * (heights[mid + i] - heights[i]);
result += heights[mid - 1] - heights[mid];
System.out.println(result);
} else {
for (int i = 0; i result += 2 * (heights[mid + 1 + i] - heights[i]);
altResult += 2 * (heights[mid + 1 + i] - heights[i]);
}
result += heights[mid - 1] - heights[mid];
altResult += heights[mid] - heights[mid + 1];
System.out.println(Math.max(result, altResult));
}
}
}
}