爱奇艺2020秋招笔试真题

 爱奇艺2020秋招笔试真题

1、切割块

【题目描述】有一个x*y*z的立方体,要在这个立方体上砍k刀,每一刀可以看作是用一个平行于立方体某一面的平面切割立方体,且必须在坐标为整数的位置切割,如在x=0.5处用平面切割是非法的。

问在切割k刀之后,最多可以把立方体切割成多少块。

输入描述

输入仅包含一行,一行包含4个正整数x,y,z,k分别表示x*y*z的立方体和切割k刀。(1<=x,y,z<=10^6,0<=k<=10^9)

描述

    输出仅包含一个正整数,即至多切割成多少块。

输入样例1


2 2 2 3


出样例1


8


【解题思路】

由于必须按整数来切,所以

max块=x*y*z,实际就是体积的大小

max刀=(x-1)+(y-1)+(z-1),就是保证切出来的==立方体体积最小=1==边长为3就要切2刀,2*2*2* 切3刀=8块,2*2*2* 切2刀=几块?

这需要在某一个边上少切一刀,是那一条边?(实践证明是最长的那条边)

【参考代码】


#include <bits/stdc++.h>
using namespace std;
int main() {
    int a[5], k;
    long long int maxd, maxk, m = 104909296875;
    scanf("%d%d%d%d", &a[1], &a[2], &a[3], &k);
    //刀数
    maxd = (long long int)(a[1] - 1) + (a[2] - 1) + (a[3] - 1);
    //快数
    maxk = (long long int)a[1] * a[2] * a[3];
    // k超过刀数
    if (k >= maxd) {
        printf("%lld\n", maxk);
        return 0;
    } else
        while (maxd != k) {
            //找最长的那条边
            sort(a + 1, a + 4);
            //最长边减1
            a[3]--;
            //新的刀数和快数
            maxd = (long long int)(a[1] - 1) + (a[2] - 1) + (a[3] - 1);
            maxk = (long long int)a[1] * a[2] * a[3];
        }
    printf("%lld", maxk);
    return 0;
}


2、谁当裁判

【题目描述】假设有N个人要玩游戏,每轮游戏必须选出一个人当裁判,剩下的N-1个人作为玩家。现在第i个人要求作为玩家进行至少Ai轮游戏,那么至少需要进行多少轮游戏才能满足所有人的要求?

输入描述

第一行包含一个整数N,2≤N≤105

第二行包含N个空格隔开的整数A1到AN,0≤Ai≤109

输出描述

输出至少需要进行的游戏轮数。

输入样例


3
2 2 3


输出样例


4


【解题思路】

和值减去最大值即为答案。

【参考代码】


N=int(input().strip())
A=list(map(int,input().strip().split()))
print(sum(A)-max(A))


3、排列计数

【题目描述】给定一个大小为N-1且只包含0和1的序列A1到AN-1,如果一个1到N的排列P1到PN满足对于1≤i<N,当Ai=0时Pi<Pi+1,当Ai=1时Pi>Pi+1,则称该排列符合要求,那么有多少个符合要求的排列?

输入描述

第一行包含一个整数N,1<N≤1000。

第二行包含N-1个空格隔开的整数A1到AN-1,0≤Ai≤1。

输出描述

输出符合要求的排列个数对109+7取模后的结果。

输入样例


4
1 1


输出样例


3


样例解释

符合要求的排列为{3 2 1 4}、{4 2 1 3}和{4 3 1 2}。

【解题思路】

根据数组中的值,对应dp即可。

【参考代码】


def main():
    mod = 1000000007
    N = int(input())
    flags = list(map(int, input().strip().split()))
    dp = [[0 for _ in range(N+1)] for _ in range(N)]
    for i in range(N):
        dp[0][i] = 1
 
    for i in range(1, N):
        if flags[i-1] == 1:
            for j in range(N-i-1, -1, -1):
                dp[i][j] += dp[i-1][j+1] + dp[i][j+1]
       

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2021名企校招笔试真题-技术 文章被收录于专栏

&lt;p&gt; 本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题。 内容中包含多个名企的笔试真题,附有题目思路及参考代码 本专刊购买后即可解锁所有章节,故不可以退换哦~ &lt;

全部评论
第二题给的答案有问题,如果有三个人,输入1 3 7,按照给的答案结果是4,这显然不对,我觉得答案应该是max(最大值,和值减去最大值)。
点赞 回复 分享
发布于 2020-07-02 17:00

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务