蓝桥杯A组——Python(10.06)Day8
- 题目伺候上
W2T4-重新排序:
给定一个数组A和一些查询
Li,Ri求数组中第Li至第Ri个元素之和。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。
小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?输入格式: 输入第一行包含一个整数n。
第二行包含n个整数A1,A2,···,An,相邻两个整数之间用一个空格分隔。 第三行包含一个整数m表示查询的数目
接下来m行每行包含两个整数Li、 Ri相邻两个整数之间用一个空格分隔。输入样例:
5
1 2 3 4 5
2
2 3
2 5
#用差分法,把每个位置用的次数统计一下,再从大到小依次放入位置使用多的
n = int(input('请输入数组大小:'))
a = [0] + list(map(int,input('请输入数组元素用空格分开:').split()))
m = int(input('输入测试组数:'))
pre = [0]*(n+5)
for i in range(m):
l,r = map(int,input('输入测试边界用空格分开:').split())
pre[l]+=1
pre[r+1]-=1
#差分计数实在巧妙
for i in range(1,n+1):
pre[i]+=pre[i-1]
ans1,ans2 = 0,0
for i in range(1,n+1):
if pre[i]:
ans1+=a[i]*pre[i]
#sort()实现排序
a.sort(reverse=True)
pre.sort(reverse=True)
now = 0
for i in pre:
if i!=0:
ans2 += a[now]*i
now += 1
else:
break
print(ans2-ans1)
- 逻辑简单,sort()实现降序也降低了编程费时程度
W2T5-全排列的价值:
对于一个排列 A=(a1,a2,···,an),定义价值ci为a1至ai-1中小于ai的数的个数即c_{i}
= |{a_{j}}|j<i,a_{j}<a_{i}| 定义A 的价值为sum C_{i},给定n求1至n的全排列中所有排列的价值之和。
首先需要明确在一个全排列中正序对的数量会等于逆序对的数量。1~n的全排序有n!个情况,每个情况有n*(n-1)/2的数对。所以全排列的价值可以表示为:
#这题用数学分析后value直接解出来
n = int(input())
p = 998244353
res = ((n-1)*n/4)%p
#for循环是阶乘
for i in range(1,n+1):
res = (res*i)%p
print(int(res))
数学解题赞👍
————————————————————————————————————————
坚持ing
W2(D8)——end