【第一题】输入一个数组,找出数组中的四个元素,构成一个平行四边形,求平行四边形最大面积。
import java.util.Scanner;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class Main2{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();//边的数量
long[] arr = new long[n];
for(int i=0;i<n;i++){
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
long len1 = 0;
long len2 = 0;
int count=0;
Set<Long> set = new HashSet<>();
Set<Long> set1 = new HashSet<>();
boolean flag = false;
for1:
for(int i=n-1;i>0;i--){
if(!set.add(arr[i])){
len1 = arr[i];
for2:
for(int j=i-1;j>=0;j--){
if(!set1.add(arr[j])){
len2 = arr[j];
flag = true;
break for1;
}
}
}
}
if(flag == false) System.out.println(-1);
else{
System.out.println(len1*len2);
}
}
sc.close();
}
}
【第二题】给定一个数组,把元素放到头部位置(头插),问:至少多少次操作能够使数组变得有序?
import java.util.Scanner;
import java.util.Arrays;
public class Main1{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];//所给定的乱序数组
int[] temp = new int[n];//辅助数组
for(int i=0;i<n;i++){
arr[i] = sc.nextInt();
temp[i] = arr[i];
}
Arrays.sort(temp);
int count=0;//记录有序的个数
int j=n-1;
//对比两个数组
for(int i=n-1;i>=0;i--){
if(arr[i] == temp[j]){
j--;
count++;
}
}
System.out.println(n-count);
}
}
如果是尾插,则改为:
int j=0;
for(int i=0;i<n;i++){
if(arr[i] == temp[j]){
j++;
count++;
}
}
【第三题】消灭怪物
给定x轴上有n个怪物,每个怪物有对应位置和血量,你拥有一个Aoe技能能使[x-y,x+y]范围内的怪物掉血,x为你使用技能的位置,y为技能范围求最少使用技能次数。
思路:
贪心
先对怪物从小到大排序,每次从消灭最左的怪物,在[最左怪物的位置,最左怪物位置 + 2 * y]区间的怪物也一起掉血。
然后再找下一个血量大于0的怪物,直到消灭所有怪物。
原理:你肯定需要消灭最左的怪物->消灭最左怪物的点肯定在[最左怪物位置,最左怪物位置+y]之间 -> 所以选择[最左怪物的位置,最左怪物位置 + 2 * y]区间的怪物也一起掉血 ->消灭所有怪物
作者:鹏哦
链接:https://www.nowcoder.com/discuss/457594?toCommentId=6538843
来源:牛客网
import java.util.Arrays;
import java.util.Scanner;
public class Main3 {
/**
* AOE 打怪
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int y = sc.nextInt();
long[][] monster = new long[n][2];
for (int i = 0; i < n; i++) {
monster[i][0] = sc.nextLong();
monster[i][1] = sc.nextLong();
}
Arrays.sort(monster, (m1, m2) -> (int)(m1[0] - m2[0])); //从小到大排序
long cnt = 0;
int mon = 0;
while (mon < n) {
cnt+= monster[mon][1]; //每次添加的次数为最左怪物的血量
long kill = monster[mon][1];
for (int i = mon; i < n; i++) {
if (monster[i][0] <= monster[mon][0] + 2 * y) { //在[最左怪物+2y]范围内的怪物都掉血
if (monster[i][1] > 0) {
monster[i][1] -= kill;
}
} else {
break;
}
}
while (mon < n && monster[mon][1] <= 0) { //找到下一个有血的怪物
mon++;
}
}
System.out.println(cnt);
}
}