牛客周赛round24题解(pypy3版)

A题

找规律模拟就行

import sys
input = sys.stdin.readline
n=int(input())
ans=[[0]*n for _ in range(n)]
idx=1
for i in range(n):
    for j in range(n):
        ans[i][j]=idx
        idx+=1
if n%2==0:
    for i in range(n):
        if i%2==1:
            ans[i].reverse()
for i in range(n):
    for j in range(n):
        print(ans[i][j],end=" ")
    print()

B题 

分解所有因子后排序,从前往后枚举

t=int(input())
for _ in range(t):
    n=int(input())
    res=[]
    for i in range(1,int(n**0.5)+1):
        if n%i==0:
            res.append(i)
            cur=n//i
            if cur!=i:
                res.append(n//i)
    res.sort()
    for v in res:
        if v*v>n:
            print(v)
            break

C题

贪心,保证合法的前提下整数部分尽量大。

s=input()
n=len(s)
px=[]
for i in range(n):
    if s[i]==".":
        px.append(i)
#小数点前的整数尽量大且保证合法,贪心考虑
i,ans=n-1,0
if px:
    if i-px[-1]>1:
        ans+=int(s[px[-1]+2:i+1])
    end=px[-1]+1
    point=px.pop()
else:
    print(int(s))
    exit(0)
for j in px[::-1]:
    a=j+2
    ans+=int(s[a:point])
    cur=int(s[point+1:end+1])
    ans+=cur*0.1
    end=j+1
    point=j
ans+=int(s[:point])
ans+=int(s[point+1:end+1])*0.1
print(round(ans,1))

D题

二分答案(因为k太大了,不然直接贪心最大堆模拟减小即可)

from math import ceil
import sys
input = sys.stdin.readline
n,k,x=map(int,input().split())
arr=list(map(int,input().split()))
arr.sort()
def check(y):
    cnt=0
    for i in range(n-1,-1,-1):
        #需要执行操作,当前元素比最大值大
        if arr[i]>y:
            cnt+=ceil((arr[i]-y)/x)
        if cnt>k:
            return False
    return True
#本来应该是枚举操作次数k,贪心地用堆取模拟减小当前最大值
#但k太大了,再加上分析最大值最小,决策单调性问题可以用二分值域来考虑
l,r=arr[0]-k*x,arr[-1]
while l<r:
    mid=(l+r)>>1
    if check(mid):
        r=mid
    else:
        l=mid+1
print(l)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值