阿里巴巴4.13笔试

#阿里巴巴笔试2020#菜哭了哦,第一道10%,第二道没时间了。

第一道题:蚂蚁森林n个小动物,1~n,小动物编号越小能力越强,现在筛选国王,每个小动物都会崇拜别的小动物或者自己,但只会崇拜比自己能力强的小动物。
问每个人最多可以获得多少票。
第一行输入n,第二行输入n个数值,数值为0代表只崇拜自己,数值为x即崇拜x.现在要投票,每个小动物可能会投给自己,也可能跟自己崇拜的人投相同的票,这里有点语义小坑,不细看会想错。
那么其实就是动态规划

#include <bits/stdc++.h>

using namespace std;
int main(){
    int n;
    while(cin >> n){
        if(n <= 1){
            cout << n << endl;
            return 0;
        }
        vector<int> num(n+1);
        vector<int> ans(n+1,0);
        for(int i = 1;i <= n;i++)//记录每个人崇拜的对象
            cin >> num[i];
        ans[n] = 1;//只有他可能投给自己,则最多为1
        ans[num[n]]++;//他崇拜的人获票+1
        for(int i = n-1;i >= 1;i--){//从后往前动态规划思想
            if(num[i] != 0){
                ans[num[i]] += ans[i]; //所有崇拜i的小伙伴都可能投给i所崇拜的人
            }
            ans[i]++;//投给自己,前面的人不会投给后面的,所以这就是最终值
            cout << ans[i] << endl;
        }
    }
    return 0;
}
大佬可以帮我看看有没有问题。

第二道题

n个城市n个人,每个城市一个人,选择一个城市x,所有人去那聚会,聚合结束所有人返回各自城市。
有m条单向路径,保证每个人可以到达城市x,一个人所消耗时间为往返距离和,且每个人都会选择最短路径,问最长的距离是多少。
第一行 输入 n,m,l 对应城市、路径、聚会城市
接下来m行,x,y,z从城市x到城市y的距离为z
输出
输出最长距离

现在想想挺简单的,就是图的遍历,找每个人最小距离然后比较,奈何一个小时还是很紧张,老是纠结第一题哪里出问题了,最后发现题没审清。
还是熟练度不够,秋招再战!
所以奉劝读题读三遍

#阿里巴巴笔试##阿里巴巴##笔试题目#
全部评论
第一题  应该 先ans[i]++;   if(num[i] != 0){            ans[num[i]] += ans[i]; //所有崇拜i的小伙伴都可能投给i所崇拜的人  }
3 回复
分享
发布于 2020-04-13 21:09
第二题是 正反图(有向图的边反过来指)各用一次迪杰斯特拉算法,注意可能会整数溢出
1 回复
分享
发布于 2020-04-13 21:06
联易融
校招火热招聘中
官网直投
第一题 我 树的遍历,  第二题   我正反 建图跑迪杰特拉 死活过93%样例 ,出来 找到原题一交就过了 。 有点无语
1 回复
分享
发布于 2020-04-13 22:41
同10%,其实是阅读理解,淦。
点赞 回复
分享
发布于 2020-04-13 20:37
考试一结束,脑子立马清醒23333
点赞 回复
分享
发布于 2020-04-13 20:41
同10ac 0ac被自己菜哭了😂
点赞 回复
分享
发布于 2020-04-13 20:43
你这个是不是没输出最后一个?
点赞 回复
分享
发布于 2020-04-13 20:45
我也是调了好久啊,还是10%
点赞 回复
分享
发布于 2020-04-13 21:10
第一题10%,第二题没时间做,第一题自我感觉没错误,怎么调都是10%😂,第一次笔试老紧张了,脑子就是浆糊,不知道能不能有面试的机会😓
点赞 回复
分享
发布于 2020-04-13 22:13
第一题 最后过了百分之九十不知道为啥 #include <iostream> #include <vector> using namespace std; int main(){     int n;     cin >> n;     vector<int> result(n);     vector<int> tmp(n);          for(int i = 0; i < n ; i++){         int val;         cin >> val;         tmp[i] = val;                  result[i]++;                  while(val != 0){             if(tmp[val-1] == 0){                 result[val-1]++;                 break;             }else{                 result[val-1]++;                 val = tmp[val-1];             }         }     }     for(auto i = 0; i < result.size(); i++){        cout << result[i] << endl;     }     return 0; }
点赞 回复
分享
发布于 2020-04-14 21:13
听别人说,笔试成绩不好,会影响秋招,所以一直不敢参加笔试,有这回事吗?😅
点赞 回复
分享
发布于 2020-04-15 14:02
请问一定要用c++写吗?🤣
点赞 回复
分享
发布于 2020-04-15 14:48
从后往前遍历, 把自己得到的崇拜票和自己的一票都给崇拜的爱豆, 这样可以不: def solution(n, an):     H = [0]*(n+1)                多了一个0, 整体往后移     for ii in range(n, 0, -1):         H[ii] += 1                  自己投自己一票                          H 的id是1~N         H[an[ii-1]] += H[ii]    把所有的都给了自己崇拜的动物, an的id是0~N-1       for ii in range(1, n+1):         print(H[ii])
点赞 回复
分享
发布于 2020-04-19 04:27
今天的比上次的难
点赞 回复
分享
发布于 2020-04-22 08:09
请问考试的时候可以看到提交的正误吗?还是只有考完才能看到ac了多少?
点赞 回复
分享
发布于 2020-09-05 17:50
感觉第一题用贪心?问每个人最多得多少票就是自己投自己,编号在自己之后的且崇拜自己的都投自己。可以保证每个人最大?
点赞 回复
分享
发布于 2021-09-09 20:41

相关推荐

4 14 评论
分享
牛客网
牛客企业服务