问题一
问题描述
小易有一个长度为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)); } } } }