1. 题目描述:
* 给出n个正整数,要求找出相邻两个数字中差的绝对值最小的一对数字,如果有差的绝对值相同的,则输出最前面的一对数。
*
* 2<n<=100,正整数都在10^16范围内
*
* 输入
* 输入包含2行,第一行为n,第二行是n个用空格分隔的正整数。
*
* 输出
* 输出包含一行两个正整数,要求按照原来的顺序输出
*
*
* 样例输入
* 9
* 1 3 4 7 2 6 5 12 32
* 样例输出
* 3 4
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
long[] arrs = new long[num];
for (int i = 0; i < num; i++) {
arrs[i] = scanner.nextLong();
}
long sum = Long.MAX_VALUE;
int t = 0;
int start = 0;
int end = 0;
for (int i = 0; i < num - 1; i++) {
if (Math.abs(arrs[i + 1] - arrs[i]) < sum) {
sum = Math.abs(arrs[i + 1] - arrs[i]);
start = i;
end = i + 1;
}
}
System.out.println(arrs[start] + " " + arrs[end]);
}
}
这个是100%通过
2. 题目描述:
* 小希偶然得到了传说中的月光宝盒,然而打开月光宝盒需要一串密码。虽然小希并不知道密码具体是什么,但是月光宝盒的说明书上有着一个长度为 n (2 <= N <= 50000)的序列 a (-10^9 <= a[i] <= 10^9)的范围内。下面写着一段话:密码是这个序列的最长的严格上升子序列的长度(严格上升子序列是指,子序列的元素是严格递增的,例如: [5,1,6,2,4]的最长严格上升子序列为[1,2,4]),请你帮小希找到这个密码。
*
*
* 输入
* 第1行: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
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[] arrs = new int [num];
for (int i = 0; i < num; i++) {
arrs[i] = scanner.nextInt();
}
System.out.println(lis(arrs));
}
public static int lis(int[]array){
int length=array.length;
if(length==0){
return 0;
}
int maxCount=0;
int[] dp=new int[length];
for (int i = 0; i < length; i++) {
dp[i]=1;
for(int j=0;j<i;j++){
if(array[j]<array[i]&&dp[i]<dp[j]+1){
dp[i]=dp[j]+1;
}
if(maxCount<dp[i]){
maxCount=dp[i];
}
}
}
return maxCount;
}
}
这个通过只有82%,暂时还未知原因
3.题目描述:
* 举重大赛开始了,为了保证公平,要求比赛的双方体重较小值要大于等于较大值的90%,那么对于这N个人最多能进行多少场比赛呢,任意两人之间最多进行一场比赛。
*
* 输入
* 第一行N,表示参赛人数(2<=N<=10^5)
*
* 第二行N个正整数表示体重(0<体重<=10^8)
*
* 输出
* 一个数,表示最多能进行的比赛场数
*
*
* 样例输入
* 5
* 1 1 1 1 1
* 样例输出
* 10
import java.util.Arrays;
import java.util.Scanner;
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int[] arrs = new int[num];
for (int i = 0; i < num; i++) {
arrs[i] = scanner.nextInt();
}
int count=0;
Arrays.sort(arrs);
for(int i=0;i<arrs.length;i++){
for(int j=i+1;j<arrs.length;j++){
if(Math.min(arrs[i],arrs[j])>=Math.max(arrs[i],arrs[j])*0.9){
count++;
}else{
break;
}
}
}
System.out.println(count);
}
}
这个通过是100%
4. 题目描述:
* 小C在做一种特殊的服务器负载测试,对于一个请求队列中的请求,每一个请求都有一个负荷值,为了保证服务器稳定,请求队列中的请求负荷必须按照先递增后递减的规律(仅递增,仅递减也可以),比如[ 1,2,8,4,3 ],[ 1,3,5 ]和[ 10 ]这些是满足规律的,还有一些不满足的,比如[ 1,2,2,1 ],[ 2,1,2 ]和[ 10,10 ]。现在给你一个请求队列,你可以对请求的负荷值进行增加,要求你调整队列中请求的负荷值,使数组满足条件。最后输出使队列满足条件最小的增加总和。
*
* 输入
* 输入有两行,第一行是N (1≤n≤5000) ,代表请求队列中的请求数量。
*
* 第二行有N个数字 a1,a2…an (1≤ai≤10^9)。Ai是第i个请求的负荷值。
*
* 输出
* 输出这个最小增加总和
*
*
* 样例输入
* 5
* 1 4 3 2 5
* 样例输出
* 6
*
* 提示
* 样例解释,此时合法队列为[1,4,5,6,5],最小增加和为6
这个题没做出来