问题一
问题描述
小易有一个长度为n的整数序列,a_1,…,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。
输入描述
输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。
第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。
输出描述
在一行中输出操作n次之后的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.*;
public class Overturn {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] array = new int[n];
for(int i=0;i<n;i++)
array[i]=sc.nextInt();
if(n%2==0){
for(int i = n-1;i>0;i-=2)
System.out.print(array[i] + " ");
for(int i = 0;i<n-2;i+=2)
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<n-2;i+=2)
System.out.print(array[i] + " ");
System.out.print(array[n-2]);
}
}
}
}
问题二
问题描述
小易现在手里有f个水果和d元,一天要消耗x元房租和1个水果,商店售卖一个水果p元,请问小易能坚持几天。
import java.util.Scanner;
public class Living {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int f = sc.nextInt();
int d = sc.nextInt();
int x = sc.nextInt();
int p = sc.nextInt();
if(d/x<=f)
System.out.println(d/x);
else
System.out.println((d-f*x)/(x+p)+f);
}
}
}
问题三
问题描述
疯狂队列,给一个数组,顺序可任意排列,要求他们得两两的差值和最大,求这个疯狂值,即:差值。
输入描述
输入包括两行,第一行一个整数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 CrazyValue {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n =sc.nextInt();
int[] arr = new int[n];
for(int i =0;i<n;i++)
arr[i] = sc.nextInt();
Arrays.sort(arr);
int res = 0,res1=0;
int middle = n/2;
if(n%2==0){
for(int i=0;i<middle;i++)
res += 2*(arr[i+middle]-arr[i]) ;
res += arr[middle-1] - arr[middle];
System.out.println(res);
}
else{
for(int i=0;i<middle;i++){
res += 2*(arr[i+middle+1]-arr[i]);
res1 += 2*(arr[i+middle+1]-arr[i]);
}
res += arr[middle-1] -arr[middle];
res1 += arr[middle] - arr[middle+1];//最后一个数字可能排错
System.out.println(Math.max(res,res1));
}
}
}
}