广联达7月22日笔试题解

第一题:给定一个数组,取四条边组成最大平行四边形的面积,输入数组,输出最大面积。
把数组排序并取个数超过2的最大的两个即可
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long[] lines = new long[n];
        int i = 0;
        while (i < n) {
            lines[i++] = scanner.nextInt();
        }
        Arrays.sort(lines);
        List<Long> side = new ArrayList<>();
        int count = 1;
        for (i = n - 1; i >= 0; i--) {
            if (side.size() >= 2) {
                break;
            }
            if (i > 0 && lines[i] == lines[i - 1]) {
                count++;
            } else {
                if (count >= 4) {
                    side.add(lines[i]);
                    side.add(lines[i]);
                } else if (count >= 2) {
                    side.add(lines[i]);
                }
                count = 1;
            }
        }
        if (side.size() < 2) {
            System.out.println(-1);
        } else {
            System.out.println(side.get(0) * side.get(1));
        }
    }
} 

第二题:有一个操可以把数组的一个元素提到0号位置,给定一个数组,输出至少多少次这样的操作使数组变得有序。
先把数组排序,如array [2 1 3 4]变为sortArray[1 2 3 4],从后向前遍历两个数组,当array中的数值不等于sortArray中的值时,跳过(这个值也就是要变换位置的值)。AC100%
import java.util.Arrays;
import java.util.Scanner;

public class Main2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = new int[n];
        int[] sortArray = new int[n];
        for (int i = 0; i < n; i++) {
            array[i] = scanner.nextInt();
            sortArray[i] = array[i];
        }
        Arrays.sort(sortArray);
        int c = 0;
        int j = n - 1;

        for (int i = n - 1; i >= 0; i--) {
            if(array[i] == sortArray[j]){
                ++c;
                --j;
            }
        }
        System.out.println(n-c);
    }
}
第三题:怪兽在一个一维的数轴上,他们有属性位置和血量,玩家可以定点攻击,攻击范围为[x-range, x+rangel,求最少的攻击次数能消灭所有的怪物。
把怪兽按位置由小到大排序,一直攻击,直到把最左边的打死,顺便打死点p + 2 * range之间的,最左边的死了,攻击它右边第一个血量>0的,直到都打死。AC100%
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main3 {
    public static void main(String[] args) {
        int time = 0;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int range = sc.nextInt();
        int[][] position = new int[n][2];
        for (int i = 0; i < n; i++) {
            position[i][0] = sc.nextInt();
            position[i][1] = sc.nextInt();
        }
        Arrays.sort(position, Comparator.comparingInt(p -> p[0]));
        for (int i = 0; i < n; i++) {
            while (position[i][1] > 0) {
                int tmp = position[i][1];
                for (int j = i; j < n; j++) {
                    if (position[j][0] - position[i][0] <= range * 2) {
                        position[j][1] -= tmp;
                    }
                }
                time += tmp;
            }
        }
        System.out.println(time);
    }
}


全部评论
第二题能解释下原理么。。
1 回复 分享
发布于 2020-07-22 23:22
赞了 第一题第二题都没完全AC 修了好久 第三题有思路了却时间到了 楼主太强了!!
1 回复 分享
发布于 2020-07-23 08:50
大佬🐮🍺
点赞 回复 分享
发布于 2020-07-22 22:48
牛逼
点赞 回复 分享
发布于 2020-07-22 23:18
牛逼
点赞 回复 分享
发布于 2020-07-23 00:19
第一题我也是这样做的,可能代码哪部分写错了,只通过了9%
点赞 回复 分享
发布于 2020-07-23 00:19
第二题气哭了,代码和楼楼几乎一样 最后那个for循环没注意我就在idea  i.for就正序遍历了。。。最后一分钟才发现没来得及改了wc
点赞 回复 分享
发布于 2020-07-23 02:29
太厉害了,看看自己的,差距啊😂😂😂
点赞 回复 分享
发布于 2020-07-23 08:33
第二题为什么这样做啊,不理解🤣
点赞 回复 分享
发布于 2020-07-23 08:40
bd,这是c++解题题解 https://www.nowcoder.com/discuss/457660?type=post&order=time&pos=&page=0&channel=666&source_id=search_post
点赞 回复 分享
发布于 2020-07-23 08:50
大佬牛逼啊
点赞 回复 分享
发布于 2020-07-23 09:21
大佬,这是我写的第三题,我没有参加笔试,看我写的对吗,单调队列维护这, #include <bits/stdc++.h> const int N = 1e5; const int M = 1e9; using namespace std; typedef long long ll; struct node {     int x, val;     bool operator<(const node& n) const     {         return x < n.x;     } }e[N]; int n,k; //数量和 范围 int main() {     cin >> n >> k;     for(int i = 1; i <= n; i++)     {         cin >> e[i].x >> e[i].val;     }     sort(e + 1, e + 1 + n);          deque<int> dq;     int sum = 0;     int max_ = 0;     for(int i = 1; i <= n; i++)     {         while(dq.size() && e[i].x - e[dq.front()].x > 2*k)         {             sum += max_;             dq.pop_front();             max_ = 0;         }         dq.push_back(i);         max_ = max(max_,e[i].val);     }     sum += max_;          cout << sum << endl; }
点赞 回复 分享
发布于 2020-07-23 09:38
第一题不知为啥只AC91%
点赞 回复 分享
发布于 2020-07-23 12:05
第二题也可以每次把头节点移动到对应的正确位置  如果头节点刚好是第一个的话就选择一个错误节点与他进行一次交换  当然全程要进行错误节点 和正确位置的保存   第三题没读懂啥意思 😅
点赞 回复 分享
发布于 2020-07-23 13:50
第二题只需要读到数字n出现就够了,读到之后数组往前找,依次找n-1,n-2,如果不是就跳过,最后会找到一个n-s,s为从n开始往前按1依次递减能够找到的最小的数,这个s就是答案值
点赞 回复 分享
发布于 2020-07-23 18:09
第一题差不多的想法只过了36%,,,好像是没考虑long型,,吐了
点赞 回复 分享
发布于 2020-07-23 18:32
第三题,我刚写完,和楼主思想一样,刚要复制提交,时间到了
点赞 回复 分享
发布于 2020-07-23 19:22
第三题感觉有点滑动窗口的意思。每一步得优先考虑消灭边上的怪物。
点赞 回复 分享
发布于 2020-07-23 21:27
大佬
点赞 回复 分享
发布于 2020-07-24 14:13

相关推荐

喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
评论
10
68
分享
牛客网
牛客企业服务