360笔试 2021/8/29

360笔试

第一部分

既有单选也有多选,而且编程题都是c++,而我选的岗位应该是Java吧。。很多c++语法看不懂额。

有图相关的知识

网络相关的挺简单的

操作系统linux命令等

第二部分

第一题

都为ACM模式

又到了一学期一次的大学生期末考试。但很多人期末考试的卷面成绩是不能及格的,需要靠较高的平时成绩来拖上去。平时成绩与期末考试的占比已经确定,假设平时成绩占比为p,期末考试占比为q,平时分为a,期末考试分数为b,则总成绩为(p*a+q*b)/100。(平时分与期末成绩都是整数,但总成绩可以是小数。)饶老师心肠特别好,他希望自己的学生及格率尽可能的高。但他也坚持期末考试分数更高的学生平时成绩也一定要更高。饶老师想知道在这种情况下,他们班的最大及格人数是多少(及格是指总成绩不低于60分)。

输入样例1

2 50 50

50 50

输出样例1

2


输入样例2

2 20 80

51 50

输出样例2

1

样例1中,两名同学,考试分数相同,平时分可以分配为100 100,两人都能及格。

样例2中,两名同学,第一位同学因为考试成绩高于第二位同学,故平时分也需要高于第二位同学;假设第一位同学平时分为100分,第二位同学最高只能得到99分的平时分,无论如何都无法及格。

过了100%,对输入的学生排序,从后往前遍历,如果学生及格,count++,如果学生不及格,结束遍历,输出count

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author keboom
 * @date 2021/8/29
 */
public class Solution1 {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int p = sc.nextInt();
        int q = sc.nextInt();
        int[] stu = new int[n];
        for (int i = 0; i < n; i++) {
            stu[i] = sc.nextInt();
        }
        Arrays.sort(stu);
        // 平时分为100
        int a = 100;
        // 及格人数
        int count = 0;
        for (int i = n - 1; i >= 0; i--) {
            // 判断最后一个数
            if (i == n - 1) {
                // 期末分数b
                int b = stu[i];
                int grade = (p * a + q * b) / 100;
                if (grade < 60) {
                    System.out.println(count);
                    break;
                } else {
                    count++;
                }
            } else if (i < n - 1 && stu[i] == stu[i + 1]) {
                count++;
            } else {
                // 期末分数b
                int b = stu[i];
                a--;
                int grade = (p * a + q * b) / 100;
                if (grade < 60) {
                    System.out.println(count);
                    break;
                } else {
                    count++;
                }
            }
            if (i == 0) {
                System.out.println(count);
            }
        }

    }
}

第二题

长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军,每位将军可以驻守一个峰火台,每个烽火台可以有多个将军驻守,将军可以影响所有距离他驻守的峰火台小于等于x的烽火台。每个烽火台的基础战斗力为士兵数,另外,每个能影响此烽火台的将军都能使这个烽火台的战斗力提升k。长城的战斗力为所有烽火台的战斗力的最小值。请问长城的最大战斗力可以是多少?

输入描述
第一行四个正整数n,m,x,k(1<=x<=n<=10^5,0<=m<=10^5,1<=k<=10^5)

第二行n个整数ai(0<=ai<=10^5)

输出描述
仅一行,一个整数,表示长城的最大战斗力

样例输入
5 2 1 2
4 4 2 4 4
样例输出
6

解释:将军放置到第二个位置和第四个位置,则所有战斗力都为6

不会,求解答!!!!给个思路,给个leetcode原题,都行,求大佬解答啊!!!!

#360笔试##360公司##笔经#
全部评论
ak的来说一下第二题思路吧。 首先求最小值最大一般来说是个二分答案的问题,这个题就是。我们可以二分一个值,检查是否能达到。检查能否达到的方法就是把每一个位置还缺几个将军算出来,因为最左或者最右必须要被覆盖,所以从左往右遍历,在需要将军的地方,假设是i,那么就在i+x的位置放,是最优的,这样模拟就可以确定当前值是否满足要求了。。。
9 回复 分享
发布于 2021-08-29 17:38
int main() { int  n, m, x, k; cin >> n >> m >> x >> k; vector<int> nums(n, 0); for (int i = 0; i < n; i++) cin >> nums[i]; int m_min = 50000; for (auto its : nums) m_min = min(its, m_min); int m_max = m_min + m * k; int l = 1; int r = m_max; while (l < r) { int mid = (l + r + 1)/2; vector<int> dp(n, 0); int numm = 0; bool b1 = true; for (int i = 0; i < n; i++) { int num = 0; int r0 = i + x < n ? i + x : n-1; for (int j = i - x>0 ? i - x : 0; j <= r0; j++) { num += dp[j]; } if (num * k + nums[i] >= mid) { continue; } else { int lest = mid - num * k - nums[i]; int num2 = lest / k; if (lest % k != 0) num2++; if (num2 + numm > m) { b1 = false; break; } dp[r0] += num2; numm += num2; } } if (b1) { l = mid; } else r = mid - 1; } cout << (l + r) / 2 << endl; system("pause"); } 二分查找
6 回复 分享
发布于 2021-08-29 17:44
输出了一个6,过了18%,哈哈哈
4 回复 分享
发布于 2021-08-29 16:53
第二题,用疯狂排序法,27%
2 回复 分享
发布于 2021-08-29 17:03
第二题 二分枚举 答案 check函数的时间复杂度 o(n * x),过了0.82,以为是超时的问题因为数据规模是10^5 * 10^ 5,加了个滑动窗口优化,优化完变成0.18😂😂😂,发现check的函数有问题hhh, 遂放弃hhh,这是我对这道题的挣扎😓😓😓
2 回复 分享
发布于 2021-08-29 17:04
第二题 两行代码 直接输出数组最小值 + m*k  过了18%
2 回复 分享
发布于 2021-08-29 17:12
有没有大佬第二题有思路啊
1 回复 分享
发布于 2021-08-29 16:45
第一题AC,第二题18%,实在想不出来,提前交卷了
1 回复 分享
发布于 2021-08-29 16:59
有多选吗,没看题😥
1 回复 分享
发布于 2021-08-29 17:00
第二题可以动态规划
1 回复 分享
发布于 2021-08-29 17:01
输出6,和2 过了27%
1 回复 分享
发布于 2021-08-29 17:32
1 回复 分享
发布于 2021-08-29 17:38
这样写更简洁 import java.util.*; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int num = 100, res = 0;         int n = sc.nextInt();         int p = sc.nextInt();         int q = sc.nextInt();         int[] scores = new int[n];         for (int i = 0; i < n; i++)             scores[i] = sc.nextInt();         Arrays.sort(scores);         for (int i = n - 1; i >= 0; i--) {             if (i < n - 1 && scores[i] < scores[i + 1]) num--;             double sum = (p * num + q * scores[i]) / 100;             if (sum >= 60) res++;         }         System.out.println(res);     } }
1 回复 分享
发布于 2021-08-29 19:15
第一题ac了,第二题,我就输出了个6,然后过了18个
1 回复 分享
发布于 2021-08-30 10:24
我直接不停排序和加操作过了36,复杂度太高超时了,另外这么多c语言题目时什么鬼😂
点赞 回复 分享
发布于 2021-08-29 16:43
还没考完就发答案了吗😥
点赞 回复 分享
发布于 2021-08-29 16:43
第二题暴力求解超时,过了27%
点赞 回复 分享
发布于 2021-08-29 16:44
我c++.岗位 为什么全是 java的题??
点赞 回复 分享
发布于 2021-08-29 16:45
第二题猜个二分分半天没出来哈哈哈
点赞 回复 分享
发布于 2021-08-29 16:45
第二题没思路,就过了27%,放弃了😥
点赞 回复 分享
发布于 2021-08-29 16:52

相关推荐

10-24 16:51
门头沟学院 Java
点赞 评论 收藏
分享
8 55 评论
分享
牛客网
牛客企业服务