目录
1、前言
为什么取【学长带练】这个名字呢?因为吕同学买的课程的命名就是这样的。这次“带练”的两道题目比较简单,就不再赘述了,直接看题。
2、题目1——四平方和
题目描述
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 4 个正整数的平方和。
如果把 0 包括进去,就正好可以表示为 4 个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 4 个数排序:
0 ≤ a ≤ b ≤ c ≤ d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
输入描述
程序输入为一个正整数 N ( N < 5×10^6 )。
输出描述
要求输出 4 个非负整数,按从小到大排序,中间用空格分开
输入输出样例
输入:
12
输出:
0 2 2 2
运行限制
- 最大运行时间:3s
- 最大运行内存: 256M
import os
import sys
# from math import *
import math
try:
N=int(input())
m=int(math.sqrt(N))
for i in range(m+1):
a=int(math.sqrt(N-i*i))
for j in range(i,a+1):
b=int(math.sqrt(N-i*i-j*j))
for k in range(j,b+1):
c=N-i*i-j*j-k*k
d=int(math.sqrt(c))
if d<k:
break
if d*d==c:
print(i,j,k,d)
exit(0)
except Exception as e:
pass
from math import *
try:
n = int(input())
n_1 = int(sqrt(n))
for a in range(n_1+1):
n_2 = int(sqrt(n-a*a))
for b in range(a,n_2+1):
n_3 = int(sqrt(n-a*a-b*b))
for c in range(b,n_3+1):
t = n-a*a-b*b-c*c
d = int(sqrt(t))
if d<c: break
if d*d==t: print(a,b,c,d); exit(0)
except Exception as e: pass
3、题目2——最大距离
题目描述
在数列 a1, a2, ⋯, an 中,定义两个元素 ai 和 aj 的距离为 | i - j | +∣ai − aj∣,即元素下标的距离加上元素值的差的绝对值,其中∣x∣ 表示 x 的绝对值。
给定一个数列,请问找出元素之间最大的元素距离。
输入描述
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a1, a2, ⋯, an,相邻的整数间用空格分隔,表示给定的数列。
其中,2 ≤ n ≤ 1000,0 ≤ 数列中的数 ≤ 10^4。
输出描述
输出一行包含一个整数,表示答案。
输入输出样例
输入:
5
9 4 2 4 7
输出:
9
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
from math import *
n=int(input())
nums=list(map(int,input().split()))
maxn=-1
for i in range(n):
for j in range(i+1,n):
if j-i+abs(nums[i]-nums[j])>maxn:
maxn=j-i+abs(nums[i]-nums[j])
print(maxn)
注意上面的代码时间复杂度优化到 O(n^2/2) 并没有什么卵用,其和 O(n^2) 达到的效果是一样的,该过的样例照过,不该过的样例一样不能过。
以上,【学长带练】编程题练习1
祝好