7.22广联达笔试题代码记录

【第一题】输入一个数组,找出数组中的四个元素,构成一个平行四边形,求平行四边形最大面积。

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值