8.21 阿里笔试

第一题

  • 容易想到的过河方案就是最轻的人作为摆渡人,一趟一趟运
  • 还有一种是,最轻的人把第二轻的送到对岸,自己回来,再让最重的两个人过去,第二轻的再把船划回来
  • 一直比较这两种方案,直到人数小于3
  • AC
def first():
    t = int(input())
    for _ in range(t):
        n = int(input())
        weight = list(map(int, input().split(' ')))
        weight.sort()
        res = 0

        while n > 3:
            res += min(weight[1] * 2 + weight[0] + weight[-1], weight[0] * 2 + weight[-1] + weight[-2])
            weight.pop()
            weight.pop()
            n -= 2

        if n == 1 or n == 3:
            res += sum(weight)
        elif n == 2:
            res += max(weight)

        print(res)

第二题

  • 这个题我是自己枚举了3、4、5、6的情况,在草稿纸上发现的规律
  • 从特殊到一般,我就是猜测规律
  • 假设 A选点,B先走,A再走
  • 我估计是 B 必胜,每次A、B都会选权值最大的点,但我不会证明
  • 最后一分钟提交,本来想着能过多少算多少,居然AC了,其实是没想到的....

举个5个顶点的例子

  • B占据引导的地位,来左右A的路线

  • 开始A选权值最大的点
  • B走到权值第二大的点
  • A走到权值第三大的点
  • B回到权值最大的点
  • A走到权值第四大的点
  • B回到权值第二大的点
  • A走到权值第五大的点
  • B回到权值最大的点
  • A无路可走,B获胜

  • 计算权值和的时候就会发现代码里的规律了
def second():
    n = int(input())
    perfect = list(map(int, input().split(' ')))
    res = 0
    perfect.sort()
    for i in range(n - 1):
        res += perfect[-1] * perfect[i]
    for i in range(n - 2):
        res += perfect[-2] * perfect[i]
    print(res)


#笔试题目##阿里巴巴#
全部评论
这么简单?
1
送花
回复 分享
发布于 2020-08-21 20:02
蹲一个思路...
1
送花
回复 分享
发布于 2020-08-21 20:22
神州信息
校招火热招聘中
官网直投
同蹲第二题思路
1
送花
回复 分享
发布于 2020-08-21 20:23
第二题怎么做的。。
1
送花
回复 分享
发布于 2020-08-21 20:29
//第二题 #include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int* record = new int[n + 1](); for (int i = 1; i < n + 1; ++i) cin>>record[i]; sort(record+1,record+n+1); int** res = new int* [n + 1]; for (int i = 0; i < n + 1; ++i) { res[i] = new int[n + 1](); if (i == 0) continue; for (int j = 1; j <= n; ++j) { if (i == j) continue; res[i][j] = 1; } } int sum = 0; int i = n; bool flag = true; while (flag) { int num = 0; for (int j = n; j >= 1; --j) { if (i == j) continue; if (res[i][j] == 1) { sum += record[i] * record[j]; //cout << "i:"<<i<<" j:"<<j<<" sum:"<<sum << endl; res[i][j] = 0; res[j][i] = 0; i = j; ++num; break; } } if (num == 0) flag = false; else flag = true; } cout << sum << endl; }
1
送花
回复 分享
发布于 2020-08-21 20:32
楼主光辉下说一下第二题思路。 3个点,结果很明显。 4个点,从3个点最后状态开始,只能前往第4点,然后从第4点走回去。 5个点,从4个点最后状态开始,只能前往第5点,然后从第5点走回去。 ……
1
送花
回复 分享
发布于 2020-08-21 20:34
第二题可以分享下思路吗大佬
点赞
送花
回复 分享
发布于 2020-08-21 20:02
大佬牛逼,我就a了第一个,第二题没思路
点赞
送花
回复 分享
发布于 2020-08-21 20:03
2 3 7 8求解释
点赞
送花
回复 分享
发布于 2020-08-21 20:06
第二题这...
点赞
送花
回复 分享
发布于 2020-08-21 20:07
第二题能a吗?
点赞
送花
回复 分享
发布于 2020-08-21 20:12
太强了大佬,可以推荐下学习路径吗?鄙人刷完题做起笔试还是啥也不会。🤣
点赞
送花
回复 分享
发布于 2020-08-21 20:12
tql 了,求思路
点赞
送花
回复 分享
发布于 2020-08-21 20:36
没参加的人好奇问一下,第二题是什么题?
点赞
送花
回复 分享
发布于 2020-08-21 20:49
谁发一下题啊,今晚去跑滴滴了
点赞
送花
回复 分享
发布于 2020-08-21 21:13
可以说一下第二题的题目吗
点赞
送花
回复 分享
发布于 2020-08-21 21:34
牛皮🐮
点赞
送花
回复 分享
发布于 2020-08-21 22:28
大大太厉害了
点赞
送花
回复 分享
发布于 2020-08-21 22:28
第二题思路牛逼,完全就是数学博弈,我也看了下
点赞
送花
回复 分享
发布于 2020-08-21 22:58
tql
点赞
送花
回复 分享
发布于 2020-08-21 23:46

相关推荐

18 42 评论
分享
牛客网
牛客企业服务