输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),表示学生的人数 第二行为n个整数h[i](1 ≤ h[i] ≤ 1000),表示每个学生的身高
输出一个整数,表示n个学生列队可以获得的最大的疯狂值。 如样例所示: 当队列排列顺序是: 25-10-40-5-25, 身高差绝对值的总和为15+30+35+20=100。 这是最大的疯狂值了。
5 5 10 25 40 25
100
逆向排序,分成较大部分和较小部分。再分奇偶讨论即可。
import math def solve(nums): if len(nums) == 1: return nums[0] nums = sorted(nums, reverse=True) length = len(nums) max_part = nums[0: math.ceil(length / 2)] min_part = nums[math.ceil(length / 2):] if len(nums) % 2 == 0: return 2 * sum(max_part[:-1]) + max_part[-1] - 2 * sum(min_part[1:]) - min_part[0] else: return 2 * sum(max_part[:-2]) + max_part[-2] + max_part[-1] - 2 * sum(min_part)
占用内存:3568k
"""" 思路:先将height排序,每一次取出最小值和最大值放在队列中 然后再取出最小值和最大值,最小值放在上次最大值的右边 最大值放在上次最小值的左边 Note:需要判断输入个数的奇偶性,若是奇数,最后一个元素 是防止在队头或者队尾,需要和当前的队头和队尾元素比较 eg1: 25-10-40-5-25(n为奇数) sort:5-10-25-25-40 第一次取出min=5,max=40 queue:[5,40] 第二次取出min=10,max=25 queue:[25,5,40,10] 第三次取出25,放在队头or队尾?明显放在队尾差异更大 queue:[25,5,40,10,25] res = 20+35+30+15=100 eg2:1-2-4-8-6-10(n为偶数) sort:1-2-4-6-8-10 第一次取出min=1,max=10 queue:[1,10] 第一次取出min=2,max=8 queue:[8,1,10,2] 第一次取出min=4,max=6 queue:[4,8,1,10,2,6] res = 4+7+9+8+4=32 """ n = int(input()) height = list(map(int,input().split())) height.sort() min_value = height[0] max_value = height[-1] res = abs(max_value-min_value) # 队头指针 top = 1 # 队尾指针 rear = n-2 while top<=rear: # 当n为奇数时,最后一步top==rear if top==rear: res += max(abs(min_value-height[top]),abs(max_value-height[rear])) else: # 计算右边差距 res += abs(max_value-height[top]) # 计算左边差距 res += abs(min_value-height[rear]) # update min and max min_value = height[top] max_value = height[rear] # 移动指针 top += 1 rear -=1 print(res)
n = int(input())
n = int(input()) h = list(map(int, input().split())) h.sort() temp = [h[0]] crazy_sum = 0 left = 1 right = n-1 while left <= right: hl_0 = abs( h[left] - temp[0] ) hl__1 = abs( h[left] - temp[-1] ) hr_0 = abs( h[right] - temp[0] ) hr__1 = abs( h[right] - temp[-1] ) index = [hl_0, hl__1, hr_0, hr__1] max_index = max(index) if index.index(max_index) == 0: temp.insert(0, h[left]) left += 1 elif index.index(max_index) == 1: temp.append(h[left]) left += 1 elif index.index(max_index) == 2: temp.insert(0, h[right]) right -= 1 else: temp.append(h[right]) right -= 1 for i in range(n-1): crazy_sum += abs(temp[i] - temp[i+1]) print(crazy_sum)
#这个题的排列方式是固定的,大数中间插小数,大数小的放两边,小数大的放一边,根据数列大小的奇偶性,使用不同算法。
import sys
if __name__=='__main__':
line=sys.stdin.readline().strip()
num=int(line)
line1=sys.stdin.readline().strip()
num_list=list(map(int,line1.split()))
num_list=sorted(num_list)
a=num//2
l_list=num_list[a:]
s_list=num_list[:a]
if num%2!=0:
ans=sum(l_list)+sum(l_list[2:])-2*sum(s_list)
else:
ans=sum(l_list)+sum(l_list[1:])-sum(s_list)-sum(s_list[:-1])
print (ans)
while True: try: n=int(input()) h=sorted(list(map(int,input().split()))) Max,Min,res=0,0,0 if n%2==1: while(len(h)>1): res+=h[-1]-Min+Max-h[0] Min=h.pop(0) Max=h.pop(-1) res+=max(abs(h[0]-Min),abs(h[0]-Max)) print(res) else: while(len(h)>0): res+=h[-1]-Min+Max-h[0] Min=h.pop(0) Max=h.pop(-1) print(res) except: break
n = int(input()) x = list(map(int, input().split())) x.sort() mid = n//2 a = [] b = [] head = 0 last = n-1 a.append(x[mid]) for i in range(0, mid): a.append(x[head]) a.append(x[last]) head+=1 last-=1 for i in range(0,n-1): all = abs(a[i] - a[i+1]) b.append(all) print(sum(b))
n=int(input()) h=list(map(int,input().split())) h.sort() tmp=[h[0]] left=1 right=n-1 sum=0 while left<=right: l0=abs(h[left]-tmp[0]) l1=abs(h[left]-tmp[-1]) r0=abs(h[right]-tmp[0]) r1=abs(h[right]-tmp[-1]) t=max(l0,l1,r0,r1) if t==l0: tmp.insert(0,h[left]) left+=1 elif t==l1: tmp.append(h[left]) left+=1 elif t==r0: tmp.insert(0,h[right]) right-=1 else: tmp.append(h[right]) right-=1 for i in range(n-1): diff=abs(tmp[i+1]-tmp[i]) sum=sum+diff print(sum)
通过60%哪里出错了呢 n = int(input()) l = list(map(int, input().split())) mid = max(l) tmp = [mid] l.remove(mid) def fin2min(list): min_1 = min(l) tmp.append(min_1) l.remove(min_1) min_2 = min(l) tmp.insert(0, min_2) l.remove(min_2) return tmp def fin2max(list): max_1 = max(l) tmp.append(max_1) l.remove(max_1) max_2 = max(l) tmp.insert(0, max_2) l.remove(max_2) return tmp while len(l) >= 2: fin2min(l) fin2max(l) if len(l) == 1: if abs(l[0]-tmp[0])>=abs(l[0]-tmp[-1]): tmp.insert(0,l[0]) else: tmp.append(l[0]) sum = 0 for i in range(n-1): sum += abs(tmp[i+1]-tmp[i]) print(sum)
自己写的代码,超级简单,思路是先加一个大的,再一左一右各加一个小的, 再一左一右各加一个大的,一直到剩最后一个判断一下哪里比较合适。最后计算结果。
n = int(input()) a = [int(i) for i in input().split()] a.sort() b = [] flag = 0 b.append(a[-1]) a.pop() while a: if flag==0: if a: b.append(a[0]) a.pop(0) if a: b.insert(0,a[0]) a.pop(0) flag=1 else: if a: b.append(a[-1]) a.pop() if a: b.insert(0,a[-1]) a.pop() flag=0 if len(b)>=2 and abs(b[0]-b[1])<abs(b[0]-b[-1]): x = b.pop(0) b.append(x) s_sum = 0 for i in range(len(b)-1): s_sum+=abs(b[i]-b[i+1]) print(s_sum) #print(b)
import sys if __name__ == "__main__": n = int(sys.stdin.readline().strip()) line = sys.stdin.readline().strip() x = map(int, line.split()) if n%2 == 0: x = sorted(x) ans = abs(x[0] - x[-1]) for i in range(n/2-1): ans = ans + abs(x[i]-x[-i-2]) + abs(x[-i-1]-x[i+1]) if n%2 == 1: if (n/2)%2 == 0: x = sorted(x,reverse=True) ans1 = abs(x[-1]-x[0]) + abs(x[-1]-x[1]) for i in range((n-1)/2+1)[2:]: ans1 = ans1 + abs(x[-i]-x[i-2]) + abs(x[-i]-x[i]) x = sorted(x) ans2 = abs(x[-1]-x[0]) + abs(x[-1]-x[1]) for i in range((n-1)/2+1)[2:]: ans2 = ans2 + abs(x[-i]-x[i-2]) + abs(x[-i]-x[i]) ans = max(ans1,ans2) if (n/2)%2 == 1: x = sorted(x) ans1 = abs(x[0]-x[-1]) + abs(x[0]-x[-2]) for i in range((n-1)/2)[1:]: ans1 = ans1 + abs(x[i]-x[-i-2]) + abs(x[i]-x[-i]) x = sorted(x,reverse=True) ans2 = abs(x[0]-x[-1]) + abs(x[0]-x[-2]) for i in range((n-1)/2)[1:]: ans2 = ans2 + abs(x[i]-x[-i-2]) + abs(x[i]-x[-i]) ans = max(ans1,ans2) print ans
n = int(input()) l = list(map(int,input().split())) l.sort() temp =[l[0]] left = 1 right = n-1 res = 0 while left<=right: r0 = abs(temp[0] - l[right]) lr = abs(temp[-1] - l[right]) l0 = abs(temp[0]-l[left]) l1 = abs(temp[-1]-l[left]) tl = [r0,lr,l0,l1] m = max(tl) if tl.index(m)==0: temp.insert(0,l[right]) right-=1 if tl.index(m)==1: temp.append(l[right]) right-=1 if tl.index(m)==2: temp.insert(0,l[left]) left+=1 if tl.index(m)==3: temp.append(l[left]) left+=1 for i in range(n-1): res+=abs(temp[i+1]-temp[i]) print(res)
# python代码,下午一直通不过,现在通过了 # 跟楼上的思路一样,剩两个数的时候,情况没考虑清楚就一直过不了 n = int(input()) nums = [int(k) for k in input().split()] nums = sorted(nums) result = [] result.append(nums[-1]) nums.pop() while len(nums): result.append(nums[0]) result.insert(0, nums[1]) result.append(nums[-1]) result.insert(0, nums[-2]) nums.pop() nums.pop() nums.pop(0) nums.pop(0) if len(nums) < 4: break if len(nums) == 3: result.append(nums[0]) result.append(nums[2]) result.insert(0, nums[1]) elif len(nums) == 2: if abs(result[0] - nums[0]) + abs(result[-1] - nums[1]) > abs(result[0] - nums[1]) + abs(result[-1] - nums[0]): result.append(nums[1]) result.insert(0, nums[0]) elif abs(result[0] - nums[0]) + abs(result[-1] - nums[1]) == abs(result[0] - nums[1]) + abs(result[-1] - nums[0]): result.append(nums[0]) result.append(nums[1]) else: result.append(nums[0]) result.insert(0, nums[1]) elif len(nums) == 1: if abs(result[-1] - nums[0]) > abs(result[0] - nums[0]): result.append(nums[0]) else: result.insert(0, nums[0]) re = 0 for i in range(n - 1): re += abs(result[i] - result[i + 1]) print(re)