暴力中等省赛题

1.​​​​​​递增三元组

#以Bi为固定点,在A中查找插入位置m,则A中比Bi小的有m个,
#这表示符合条件的三元组(i,j,k)i的数量有m个,同样的K有len(C)-n个
N=int(input())
A=list(map(int,input().split()))
B=list(map(int,input().split()))
C=list(map(int,input().split()))
A.sort()
C.sort()
import bisect
ans=0
for j in B:
  m=bisect.bisect_left(A,j)
  n=bisect.bisect_right(C,j)
  ans+=m*(N-n)
print(ans)

 2.修改数组

参考文章icon-default.png?t=M276https://blog.csdn.net/weixin_45445598/article/details/122499260

# 并查集 用于处理元素分组 管理一些不相交的集合 如血姻关系
#查找祖先
def find(x):
    global fa
    if fa[x] != x:
        fa[x] = find(fa[x])
    return fa[x]

N = int(input())

A = [int(temp) for temp in input().strip().split()]
# 首先创建数组大小的并查集序列 自循环
fa = [i for i in range(1000001)]

for i in range(N):
    # 找到A[i]元素父亲
    # 如果A[i]元素没有找到 则返回A[i]的值 同时将下一次查到A[i]值指向A[i]值得下一位
    # 如果A[i]找到 则继续增加
    # 2 1 1 3 4
    # 首先2 的父亲是2 并同时把父亲数组中A[i]位置元素修改为3
    # 其次为1 1的父亲是1 同时把父亲数组中1位置元素修改为2
    # 获得 1 1的父亲此时为3 输出3 并将3的父亲修改为4
    # 获得3 3的父亲此时为4 输出4 并将此时3的父亲修改为5
    # 获得4 4的父亲此时为5 输出5 并将此时5的父亲修改为6
    A[i] = find(A[i])
    fa[A[i]] = find(A[i] + 1)

for i in range(N):
    print(A[i], end="")
    if i != N - 1:
        print(" ", end="")

3.方格分割

count=0
vis=[[1]*7 for i in range(7)]
dir=[(-1,0),(1,0),(0,-1),(0,1)]
def dfs(x,y):
    global count
    if x==0 or y==0 or x==6 or y==6:
        count+=1
        return
    # 当前点和对称点都标注访问,这样使得可以对称平均分割
    vis[x][y],vis[6-x][6-y]=0,0
    for i in range(0,4):
        # 新坐标
        newx=x+dir[i][0]
        newy=y+dir[i][1]
        if vis[newx][newy]: 
            #这个格子没有被访问,就访问,标记访问,并对其邻居做同样的操作
            dfs(newx,newy)
    vis[x][y],vis[6-x][6-y]=1,1
dfs(3,3)
print(count//4)

4.付账问题

首先将每个人带的钱从小到大排序,遍历,如果第i个人带的钱小于部分平均数此时的平均数等于减去前i-1个人支付的钱,再除以剩下未支付的n-i个人),就将所有的钱都用于支付;如果此时带的钱大于等于部分平均数,则及其和剩下的n-i-1个人都大于平均数,则拿出平均数的钱数即可。总体平均数 s 用于求标准差,部分平均数  ss 用在遍历上在未遇到大于它的钱数时做减法,所以复制一份总体平均数作为部分平均数的初值

import math
n,s=map(int,input().split())
ss=s
a=list(map(int,input().split()))
a.sort()
ans=0
ave=s/n
for i in range(n):
    if a[i]<ss/(n-i):
        ans+=(a[i]-ave)**2
        ss-=a[i]
    else:
        ans+=((ss/(n-i)-ave)**2)*(n-i)
        break
ans/=n
print("{:.4f}".format(math.sqrt(ans)))

5.乘积最大

mo=int(1e9+9)
def mod(x):
    if x<0:return -((-x)%mo)
    return x%mo
n,k=map(int,input().split())
a=[]
for i in range(n):a.append(int(input()))
a.sort()
l,r=0,n-1
ans=1
sign=1
if k%2:
    ans=a[r]
    r-=1
    k-=1
    if ans<0:sign=-1
while k:
    x,y=a[l]*a[l+1],a[r]*a[r-1]
    if x*sign>=y*sign:
        ans*=x       
        l+=2
    else:
        ans*=y
        r-=2
    ans=mod(ans)
    k-=2
print(ans)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值