阿里巴巴3.8技术岗笔试题

第一题
给你N个正整数,从小到大排序,然后问从第一个数字开始没出现的第k个正整数是多少。
T组  1<=T<=1000
1<=N<=1e5    1<=k<=1e8
比如
1
5 2
3 4 6 7 9
第一个没出现的是5  第二个没出现是8
所以输出8

AC代码:
/*
 * @Author: 7QQQQQQQ
 * @IDE: vscode
 * @Date: 2021-03-08 18:49:21
 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e6+50;
ll a[N],b[N];
int main(){
    int T;cin>>T;
    while(T--){
        int n,k;cin>>n>>k;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        for(int i=1;i<n;i++){
            b[i]=a[i+1]-a[i]-1;
        }
        int flag=0;
        for(int i=1;i<n;i++){
            if(k>b[i]) k-=b[i];
            else{ 
                cout<<k+a[i]<<endl;
                flag=1;
                break;
            }
        }
        if(flag==0) cout<<a[n]+k<<endl;
    }
    return 0;
}



第二题
给你n个工人和m个任务,还有一个利润p,每个任务需要用到x[i]个工人,利润为y[i],问你分配工人后,有多少种方案数可以让利润不小于p,答案取模1e9+7;

T组  1<=T<=100
1<=n<=100
1<=m<=100
1<=x[i]<=100
1<=y[i]<=100

第一行输入T
接下来每组输入m n p
然后输入x[i]
接下来一行输入y[i]
样例
输入:
1
2 5 3
2 2
2 3

输出:
2

一种是只做第二个任务,利润为3,一种是两个任务都做,利润为5

他这题应该所有n总和有个限制,但是题目没说,不然我dp复杂度是1e8了都
要么就是数据弱了。

AC代码:
/*
 * @Author: 7QQQQQQQ
 * @IDE: vscode
 * @Date: 2021-03-08 18:53:38
 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=1e2+50;
ll dp[N*N][N];   //dp[i][j]获得利益等于i,工人用了j个的方案数
int x[N],y[N];
int main(){
    ios::sync_with_stdio(0);
    int T;cin>>T;
    while(T--){
        int n,m,p;cin>>m>>n>>p;
        dp[0][0]=1;
        int S=0;
        for(int i=1;i<=m;i++){
            cin>>x[i];
        }
        for(int i=1;i<=m;i++){
            cin>>y[i];
            S+=y[i];
        }
        for(int i=1;i<=m;i++){
            for(int j=S;j>=y[i];j--){
                for(int k=n;k>=x[i];k--){
                    dp[j][k] += dp[j-y[i]][k-x[i]];
                    dp[j][k]%=mod;
                }
            }
        }
        ll ans=0;
        for(int i=p;i<=S;i++){
            for(int j=1;j<=n;j++) {
                ans+=dp[i][j];
                ans%=mod;
            }
        }
        for(int i=1;i<=S;i++){
            for(int j=1;j<=n;j++){
                dp[i][j]=0;
            }
        }
        cout<<ans%mod<<"\n";
    }
    return 0;
}

update:
第二题应该是数据水了
听NB群友说,我们可以注意到p<=100,所以已经大于100的利润我们可以看成一个整体去计算即可,而不需要逐一枚举。
所以复杂度是T * n * m *100 =1e8





#笔试题目##阿里巴巴#
全部评论
膜大佬
点赞
送花
回复
分享
发布于 2021-03-08 20:35
第二题你那个不用开1e4,可以把超过的全当100,这样你那个S直接可以从100枚举了。
点赞
送花
回复
分享
发布于 2021-03-08 20:43
网易互娱
校招火热招聘中
官网直投
大佬帮看看代码,第一题感觉和你的思路差不多,只过了60% t = int(input()) for i in range(t):     n, k = map(int, input().split())     alist = [int(q) for q in input().split()]     #print(alist)     alist.sort()     cnt = 0     flag = 0     res = 0     for w in range(n-1):         if cnt >= k:             print(res-(cnt-k))             flag = 1             break         pre = alist[w]         aft = alist[w+1]         cur = aft-pre-1         cnt += cur         res = pre + cur     if flag == 0:         print(alist[n-1]+k-cnt)
点赞
送花
回复
分享
发布于 2021-03-08 20:48
膜了,想问一下,时间是7点前15分钟就进入,7点正式开始,8点就截止了是吗?
点赞
送花
回复
分享
发布于 2021-03-08 21:30
您好,请问不用读写文件吗?
点赞
送花
回复
分享
发布于 2021-03-08 23:08
为什么第一题直接把输入的数据存到hashmap中然后从输出的第一个数开始有序遍历这样只能过25,这是为啥
点赞
送花
回复
分享
发布于 2021-03-08 23:22
求加群
点赞
送花
回复
分享
发布于 2021-03-21 23:45

相关推荐

10 33 评论
分享
牛客网
牛客企业服务