爱奇艺2018年实习生招聘笔试题题解-python开发

笔试总共三道编程题,在牛客网上考,难度都不高,已知的编程题题题库有四道,不过牛客网上没有公布全部的编程题,本文只写我遇到的三道。

第一题,给出三个数x,y,z,两种操作,一种是任取两个数字都加1,一种是取一个数字+2,求最少多少次操作使得三个数字相等。

思路:排序,看较小的两个数与最大的数的差值,1、差值均为偶数,直接 差值/2 求和;2、差值均为奇数,两个数+1(差值均-1),然后/2 求和,3、一奇一偶,差为偶数的数与最大的数均加1,然后差值均为偶数 /2 +1

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    int a[4];
    cin>>a[0]>>a[1]>>a[2];
    sort(a,a+3);
    int x1,x2;
    x1 = a[2]-a[0];
    x2 = a[2]-a[1];
    int ans=0;
    if(x1%2==0&&x2%2==0){
        ans += x1/2;
        ans += x2/2;
    }
    else if(x1%2==1&x2%2==1){
        ans+=1;
        x1-=1;
        x2-=1;
        ans += x1/2;
        ans += x2/2;
    }
    else{
        ans+=2;
        ans += x1/2;
        ans += x2/2;
    }
    cout<<ans<<endl;
    return 0;
}

第二题,扑克牌洗牌,给出13张扑克牌,扑克牌有对应的点数,进行n次洗牌,洗牌为分成随机的左右两堆,从左边拿一张,再从右边拿一张放在前一张上面,再从左边拿一张放在上面,重复至一堆为空,若另一堆不为空,全部放上去。给出每次洗牌时其中一堆的数量,问洗牌后的卡牌点数顺序。

小模拟,就用一个数组存卡牌拿出来的顺序,然后倒序存回去,重复n次

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int card[14],tmp[14];
int main(){
    int n;
    for(int i=0;i<13;i++){
        cin>>card[i];
    }
    int l,r;
    cin>>n;
    int cnt=0;
    int p;
    while(n--){
        cnt = 0;
        p=0;
        cin>>l;
        r = 13-l;
        while(l&&r){
            tmp[cnt++]=card[l-1];
            tmp[cnt++]=card[12-p];
            l--;
            r--;
            p++;
        }
        while(l){
            tmp[cnt++]=card[l-1];
            l--;
        }
        while(r){
            tmp[cnt++]=card[12-p];
            r--;
            p++;
        }
        /*
        for(int i=0;i<13;i++){
            printf("%d ",tmp[i]);
        }
        cout<<endl;
        */
        for(int i=0;i<13;i++){
            card[i]=tmp[12-i];
        }
    }
    for(int i=0;i<12;i++){
        printf("%d ",card[i]);
    }
    cout<<card[12]<<endl;
    return 0;
}
/*
1 2 3 4 5 6 7 8 9 10 11 12 13
2
6 1
*/

第三题,n种糖果,每种糖果无限个,某人想用这些糖果选m个放入盒子里,其中每种糖果都有最少选用l[i]和最大选用r[i],问有多少种选择方法。

思路:实际上问题可以化简,m-=l[i], num[i]=r[i]-l[i],问题变为n种糖果,每个有num[i]个,问从中选m个的方法,这是标准的二维dp  ,多重集组合数   

dp[i][j] 前i种选j个的 方法数,

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
LL n,m;
LL dp[100][105];
LL l[22],h[22];
LL num[22];
int main(){
    cin>>n>>m;
    memset(dp,0,sizeof(dp));
    for(int i=0;i<n;i++){
        cin>>l[i]>>h[i];
        m-=l[i];
        num[i]=h[i]-l[i];
    }
    for(int i=0;i<=n;i++){
        dp[i][0]=1;
    }
    for(int i=0;i<n;i++){
        for(int j=1;j<=m;j++){
            if(j>num[i]){
                dp[i+1][j] = (dp[i][j] + dp[i+1][j-1] - dp[i][j-1-num[i]] );
            }
            else{
                dp[i+1][j] = dp[i][j] + dp[i+1][j-1];
            }
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/q295657451/article/details/80030249