贝壳场景算法(Java实现)
<一>、计算绝对值:
1.题目描述:
给出n个正整数,要求找出相邻两个数字中差的绝对值最小的一对数字,如果有差的绝对值相同的,则输出最前面的一对数。
2<n<=100,正整数都在10^16范围内
输入:
输入包含1行,第一行为n,第二行是n个用空格分隔的正整数。
输出:
输出包含一行两个正整数,要求按照原来的顺序输出。
样例输入:
9
1 3 4 7 2 6 5 12 32
样例输出:
3 4
代码1如下:这是自己在编译器实现的,但是进入考试是不行的。
package com.ymm.core; import java.util.Scanner; public class Main1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] arr = new int[n]; for(int i = 0;i < n;i++) { arr[i] = in.nextInt(); } int min = arr[1] - arr[0]; int index = 1; for(int i = 1; i < n;i++) { int tmp = Math.abs(arr[i] - arr[i - 1]); if(tmp < min) { min = tmp; index = i; } } System.out.println(arr[index - 1] + " " + arr[index]); } }
正确代码:
package com.ymm.core; import java.util.Scanner; public class Main1 { public static void main(String[] args) { @SuppressWarnings("resource") Scanner in = new Scanner(System.in); int n = in.nextInt(); long[] arr = new long[n]; for(int i = 0;i < n;i++) { arr[i] = in.nextInt(); } long min = arr[1] - arr[0]; int index = 1; for(int i = 1; i < n;i++) { long tmp = Math.abs(arr[i] - arr[i - 1]); if(tmp < min) { min = tmp; index = i; } } System.out.println(arr[index - 1] + " " + arr[index]); }
注意:2<n<=100,正整数都在10^16范围内。
<二>月光宝盒的密码
1.题目描述:
小希偶然得到了传说中的月光宝盒,然而打开月光宝盒需要一串密码。虽然小希并不知道密码具体是什么,但是月光宝盒的说明书上有一个长度为n(2 <= N <= 50000)的序列a(-10^9 <= a[i] <= 10^9)的范围内。下面写着一段话:密码是这个序列的最长严格上升子序列的长度(严格上升子序列是指,子序列的元素是严格递增的,例如;[5,1,6,2,4]的最长严格上升子序列为[1,2,4]),请你帮小希找到这个密码。
输入:
第一行:1个数N,N的序列的长度(2 <= N <= 50000)
第2到N + 1行;每行1个数,对应序列的元素(-10^9 <= a[i] <= 10^9)
输出;
一个正整数表示严格最长上升子序列的长度。
样例输入:
8
5
1
6
8
2
4
5
10
样例输出:
5
代码如下:
package com.ymm.core; import java.util.Arrays; import java.util.Scanner; public class Main2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); if(n == 0) { System.out.println(0); return; } int[] arr = new int[n]; for(int i = 0;i < n;i++) { arr[i] = in.nextInt(); } int[] temp = new int[n]; int len = 0; for(int count : arr) { int i = Arrays.binarySearch(temp, 0, len, count); if( i < 0) { i = -(i + 1); } temp[i] = count; if(i == len) { len++; } } System.out.println(len); } }
<三>举重大赛
1.题目描述:
举重大赛开始了,为了保证公平,要求比赛的双方体重较小值要大于等于较大值的90%,那么对于这N个人最多能进行多少场比赛呢,任意两人之间最多进行1一场比赛。
输入:
第一行N,表示参赛人数(2 <= N <= 10^5)
第二行N个正整数表示体重(0 < 体重 <= 10^8)
输出:
一个数,表示最多能进行的比赛场数
样例输入:
5
1 1 1 1 1
样例输出:
10
代码实现:
package com.ymm.core; import java.util.ArrayList; import java.util.Scanner; public class Main3 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); ArrayList<Integer> list = new ArrayList<>(); for(int i = 0;i < n;i++) { list.add(in.nextInt()); } int res = 0; for(int i = n - 1;i > 0;i--) { double temp = list.get(i) * 0.9; for(int j = i - 1;j >= 0;j--) { if(list.get(j) >= temp) { res++; }else { break; } } } System.out.println(res); } }