笔试(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%,而我这个小菜鸡居然有一题过了所有用例,高兴!
虽然早就被通知自己简历不适合投的岗位,大概率被调剂,但是笔试的成绩还是很令人振奋的。虽然没有全过,但是超出预期,很知足!