【阿里巴巴校招】7月17日笔试凉经

第一题:(这题没写出来QAQ,我知道如何求x ^ ab的最大值,ab的值是多少)
给定一个数x,数据对 (a, b)使得a ^ b ^ x能达到最大,求使|a - b|最小的方案总数有多少。
x,a,b的范围都是0 - 2^31 次方

第二题:卖粽子(典型的背包问题)
小明要卖粽子,有m种粽子,n克面粉,多种馅料,求做出的粽子能够卖出价格最大是多少?
给定 a[] , b[], c[], d[]
其中a[i] 表示第 i 种粽子,现有馅料数目
b[i]表示第 i 种粽子,消耗多少馅料
c[i] 表示第 i 种粽子,消耗多少面粉
d[i] 表示第 i 种粽子,可以卖多少钱
ps:c[0] d[0] 表示不带陷的粽子要多少面粉,和值多少钱

有大佬看看我的代码吗????只能通过10%,然后显示超时了,难道要用二进制优化或者单调队列优化吗???

   import java.util.*;

    public class Main {
        //a馅料数目,b消耗馅料,c消耗面粉,d价格
        public static int maxValue(int[] a, int[] b, int[] c, int[] d, int V) {
            //bian li v
            int[] f = new int[V + 1];
            //bian li shu mu
            for (int i = 0; i < a.length; i++) {
                for (int j = V; j >= 0; j--) {
                    for (int k = 0; k * b[i] <= a[i] && k * c[i] <= j; k++) {
                        f[j] = Math.max(f[j - k * c[i]] + k * d[i], f[j]);
                    }
                }
            }
            return f[V];
        }

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while(sc.hasNext()) {
                int n = sc.nextInt();
                int m = sc.nextInt();
                //需要馅料
                int[] a = new int[m + 1];
                //消耗馅料
                int[] b = new int[m + 1];
                //面粉
                int[] c = new int[m + 1];
                //价格d
                int[] d = new int[m + 1];
                c[0] = sc.nextInt();
                d[0] = sc.nextInt();
                a[0] = 0;
                b[0] = 0;
                for (int i = 1; i <= m; i++) {
                    a[i] = sc.nextInt();
                    b[i] = sc.nextInt();
                    c[i] = sc.nextInt();
                    d[i] = sc.nextInt();
                    int res = maxValue(a, b, c, d, n);
                    System.out.println(res);
                }
            }
        }
    }


其实是提前先面试了,补的笔试。。。。面试面了一个小时,又写了一个小时面试官出的在线题。。。现在人有点晕。。。。明天继续补全。

#笔试题目##面经##阿里巴巴#
全部评论
没事,我们这还一堆被剃光头的呢😂
1 回复 分享
发布于 2020-07-17 21:01
同10%,已经佛了
点赞 回复 分享
发布于 2020-07-17 20:24
第一题是a,b未知吗?感觉可以取log
点赞 回复 分享
发布于 2020-07-17 20:29
哪个部门?
点赞 回复 分享
发布于 2020-07-17 20:34
long long ans = 2ll; for(; x; x -= -x & x) ans <<= 1; printf("lld\n", ans);
点赞 回复 分享
发布于 2020-07-17 21:07
阿里可以多次笔试吗?
点赞 回复 分享
发布于 2020-07-17 21:10
#include<bits/stdc++.h> using namespace std; const int N = 1e5+100; int n,m; int a[N],b[N],c[N],d[N],e[N],f[N]; int main(){     scanf("%d%d%d%d",&n,&m,&c[0],&d[0]);     e[0] = n / c[0];     for (int i = 1; i <= m; ++i){         scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);         e[i] = min(n / c[i], a[i] / b[i]);     }     for (int i = 0; i <= m; ++i){             for (int j = n; j >= 0; --j)                 for (int k = 0; k <= e[i]; ++k)                 if (j - k * c[i] >= 0)                     f[j] = max(f[j], f[j-k*c[i]] + k * d[i]);     }     printf("%d\n",f[n]);     return 0; }
点赞 回复 分享
发布于 2020-07-17 22:22
是个多重背包的问题
点赞 回复 分享
发布于 2020-07-17 22:22
第二题: 设<cost,price>为粽子的面粉消耗和价格数对。 先算出来每种粽子如果不限面粉的话最多能做出多少个,然后将所有粽子的数对加入到一个数组中,就是能做多少个就加多少次。 此时问题转化为在面粉约束下,选择数组中的哪几个粽子来制作,最后总的price最大。 设dp[n][f]=max_price为在数组index为n的时候,剩余面粉为f的时候,可以获得的最大价格。(数组index为n的含义为,对前n个元素进行选择,每个元素都是可选可不选) 然后每次循环对dp[n]进行遍历: dp[n][f-cost[i]] = max(dp[n-1][f]+price,dp[n][f-cost[i]]);    <-----生产 dp[n][f]=max(dp[n-1][f],dp[n][f]);                                       <-----不生产 最后输出dp数组中最大值即可。 写的有些匆忙,请大神来指点🤐
点赞 回复 分享
发布于 2020-07-18 01:06
完全背包问题 #include<iostream> #include<algorithm> using namespace std; int dp[20][1005]; struct node {     int a, b, c, d; }p[20]; int main() {     int n, m, c0, d0;     cin >> n >> m >> c0 >> d0;     //把纯面的粽子当成一种配料处理     p[0].a = n;     p[0].b = 0;     p[0].c = c0;     p[0].d = d0;     for (int i = 1; i <= m; i++) {         cin >> p[i].a >> p[i].b >> p[i].c >> p[i].d;         }          for (int j = 0; j < n; j++) {         dp[0][j] = 0;     }     for (int i = 0; i <= m; i++) {         dp[i][0] = 0;     }     //前i种粽子     for (int i = 0; i <= m; i++) {         //消耗j克面粉         for (int j = 1; j <=n; j++) {             //在面粉够用的情况下,最多包k个第i种配料的粽子             for (int k = 0; k*p[i].c <= j ; k++) {                 //还要保证配料够                 if (k*p[i].b <= p[i].a)                 {                     dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - k * p[i].c] + k * p[i].d);                 }             }         }     }     cout << dp[m][n] << endl;    // system("pause");     return 0; }
点赞 回复 分享
发布于 2020-07-18 21:01
有过的老哥吗
点赞 回复 分享
发布于 2020-07-20 20:26

相关推荐

评论
6
25
分享

创作者周榜

更多
牛客网
牛客企业服务