2020阿里天猫精灵笔试

笔试(4.16)

一共两道题,时间一小时,允许使用IDE。

第一题

问题

假设有n个人,分别用n个整数代表。让他们围着坐一圈,找出怎么可以让他们两两相邻的人差值(绝对值)的和最大,比如第1个人和第0、第2个人相邻,第n-1个人和第0、第n-2个人相邻。输出这个和还有这n个人的顺序。
输入包括两行,第一行是n,第二行是n个数。
输出也包括两行,第一行是差值的和,第二行是排好的顺序。

思路

想让差值的和最大,大体思路就是不能让相近的数挨着,感觉有点类似涂色问题,相邻的位置不能太接近。所以就想到先把n个数排序,再把位置分成奇数位和偶数位,然后奇数位尽量放比较小的值,偶数位尽量放比较大的值。
本来以为直接排序复杂度不低,可能会超时的,没想到一下就过了所有用例,意外之喜。

代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time  : 2020/4/15 15:52
#@Author: lee
#@File  : Alibaba2.py

import sys

if __name__ == "__main__":
    # 读取第一行的n
    n = int(sys.stdin.readline().strip())
    ans = 0
    line = sys.stdin.readline().strip()
    values = list(map(int, line.split()))

    values.sort()
    res = [0 for _ in range(n)]
    i = 0
    j = 0
    if n % 2 == 1:
        while j < n:
            res[i % n] = values[j]
            i += 2
            j += 1
    else:
        while i < n:
            res[i] = values[j]
            i += 2
            j += 1
        i = 1
        while j < n:
            res[i] = values[j]
            i += 2
            j += 1
    i = 1
    while i < n:
        if res[i] > res[i-1]:
            ans += res[i] - res[i-1]
        else:
            ans += res[i-1] - res[i]
        i += 1
    ans += res[n-1] -res[0]

    print(ans)
    for i in range(n):
        print(res[i],end=' ')

第二题

问题

又有n个人,每个人有两个属性,就是两个数,分别代表阅读能力和推理能力,假设第i个人的阅读能力为 X i X_i Xi,推理能力为 Y i Y_i Yi。然后要选俩人去参加比赛,用 X X X ( X i + X j ) / 2 (X_i+X_j)/2 (Xi+Xj)/2)代表所选俩人的平均阅读能力, Y Y Y ( Y i + Y j ) / 2 (Y_i+Y_j)/2 (Yi+Yj)/2)代表俩人的平均推理能力,求 X X X Y Y Y里面较小值(也就是这两个人的组合的弱点)最大是多少?
n+1行输入:第一行是n,后面n行每行两个数,分别代表每个人的阅读能力和推理能力;
一个输出:输出 X X X Y Y Y里面较小值(也就是这两个人的组合的弱点)的最大值,保留一位小数。

思路

除了暴力双重循环想不起来别的,但是纯暴力只能过10%的测试用例。所以想怎么优化。
考虑选的这两个人,要么就没有太大短板,要么就得是某一项特别高,不会选两项都很差的人,所以在循环里加了对某个两方面都不行的弱鸡的终止条件。思路不是很清晰,最后也没有通过所有测试用例,就不具体介绍了,万一引导错了呢。反正最终止步于通过了90%的用例。希望如果有100%的大佬看到告诉我怎么优化的。

代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time  : 2020/4/15 15:52
#@Author: lee
#@File  : Alibaba1.py

import sys
if __name__ == "__main__":
    # 读取第一行的n
    n = int(sys.stdin.readline().strip())
    # ans = 0
    people = []
    for i in range(n):
        line = sys.stdin.readline().strip()
        people.append(list(map(int, line.split())))

    m = 0
    for p1 in people:
        if p1[0] + p1[1] < m:
            continue
        for p2 in people:
            if p2[0] + p2[1] < m:
                continue
            if p1 != p2:
                X = p1[0] + p2[0]
                Y = p1[1] + p2[1]
                temp = min(X, Y)
                m = max(temp, m)
                # m = m / 2
    print(m/2)

总结

总体看还是比较好运的,因为之前有算法和编程比我好很多的人做阿里笔试,一道题过了30%,一题过了40%,而我这个小菜鸡居然有一题过了所有用例,高兴!
虽然早就被通知自己简历不适合投的岗位,大概率被调剂,但是笔试的成绩还是很令人振奋的。虽然没有全过,但是超出预期,很知足!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值