蓝桥杯A组——Python(10.06)Day8

蓝桥杯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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值