파이썬 배우기 9일차 --- 두 가지 포인트

1. 1차원 3차방정식 해법

여기에 이미지 설명 삽입
물론 이 질문이 순전히 2점이라고 생각하지는 않지만 2점 안에 포함되어 있습니다.

a,b,c,d=map(float,input().split())
x=-100
while x<=100:
    if -0.01<a*x**3+b*x**2+c*x+d<0.01:
        print("%.2f"%x,end=" ")
    x+=0.01

2. 수의 세제곱근

대담한 스타일
처음에 여기서 >>1을 사용했는데 시간이 초과되었지만 /2는 시간이 초과되지 않았습니다.
파이썬에서 >>1을 이진 오른쪽 시프트 연산에 사용하는 것은 실제로 숫자를 2로 나눈 다음 내림하는 것과 같습니다. 이 작업 모드는 실제 나눗셈이 아닌 비트 연산을 수행하기 때문에 /2 또는 //2 연산자를 사용하는 정수 나눗셈보다 빠릅니다. 그러나 경우에 따라 나눗셈에 비트 연산을 사용하면 오류나 시간 초과가 발생할 수 있습니다. 따라서 코드가 시간 초과되거나 오류가 발생하면 >>1 연산자 대신 /2 또는 //2 연산자를 사용해 보십시오.

l,r=-10000,10000
n=float(input())
while r-l>10**-8:
    mid=(r+l)/2
    if mid**3<=n:
        l=mid
    else:
        r=mid
print("%.6f"%l)

셋, 숫자의 범위

여기에 이미지 설명 삽입

n,q=map(int,input().split())
nums=list(map(int,input().split()))
while q:
    l,r=0,n-1
    m=int(input())
    while l<r:#第一个二分,查找nums中第一个大于等于m的数
        mid=l+r>>1
        if m<=nums[mid]:
            r=mid
        else:
            l=mid+1
    if nums[l]==m:#第二个二分,查找nums最后一个小于等于m的数
        print(l,end=" ")
    else:
        print(-1,end=" ")
    l,r=0,n-1
    while l<r:
        mid=l+r+1>>1
        if m>=nums[mid]:
            l=mid
        else:
            r=mid-1
    if nums[l]==m:
        print(l)
    else:
        print(-1)
    q-=1

4. 초콜릿

여기에 이미지 설명 삽입

n,k=map(int,input().split())
l,r=0,100000
h=[0]*100010
w=[0]*100010
for i in range(n):
    h[i],w[i]=map(int,input().split())
def check(mid):
    res=0
    for i in range(n):
        res+=(h[i]//mid)*(w[i]//mid)
        if res>=k:
            return True
    return False

while l<r:
    mid=l+r+1>>1
    if check(mid):
        l=mid
    else: r=mid-1
print(l)

5, 4제곱합

여기에 이미지 설명 삽입
여기서 바이너리 + 배열을 사용하면 시간이 초과되므로 여기서 사전을 사용하십시오.

n=int(input())
dic={
    
    }
c,d=0,0
while c*c<=n:
    d=c
    while c*c+d*d<=n:
        if dic.get(c*c+d*d)==None:
            dic[c*c+d*d]=(c,d)
        d+=1
    c+=1

flag=False
a,b=0,0
while a*a<=n:
    b=a
    while a*a+b*b<=n:
        x=n-a*a-b*b
        if dic.get(x)!=None:
            flag=True
            print(a,b,dic[x][0],dic[x][1])
            break
        b+=1
    if flag:
        break
    a+=1

6. 로봇 점핑 문제

여기에 이미지 설명 삽입

n=int(input())
h=list(map(int,input().split()))
def check(u):
    for i in range(n):
        u=2*u-h[i]
        if u<0:
            return False
    return True

l,r=0,100000
while l<r:
    mid=l+r>>1
    if check(mid):r=mid
    else:l=mid+1
print(l)

7. 나는 어디에 있습니까?

여기에 이미지 설명 삽입

작성 방법 1: 폭력적인 법

세트로 저장

n=int(input())
s=input()[:n]
t=set()
res=1
for i in range(n):
    for j in range(i+1,n):
        mp=s[i:j+1] if j+1<n else s[i:]
        if mp in t:
            res=max(res,j-i+2)#如果最大为ABC有重复的话,那么可以看到至少4个数确定位置
        else: t.add(mp)
print(res)

작성 방법 2: 파이썬 자체 라이브러리 함수 사용

from collections import defaultdict
N = int(input())
map = input()[:N]
l, r = 0, N-1
while l < r:
    flag, mid, have = True, (l + r) >> 1, defaultdict(bool)
    for i in range(N-mid+1):
        mapi = map[i:i+mid]
        if have[mapi]:
            flag = False
            break
        else:
            have[mapi] = True
    if flag:
        r = mid 
    else:
        l = mid + 1
print(r)

작성 방법 3: dict 사용

n,s=int(input()),input()
for i in range(1,n+1):
    d,tag=dict(),0
    for l in range(n-i+1):#注意比较这个区间和上面的区别,上面是前查后,这里是后查前,因此最后一个不能省
        a=s[l:l+i]
        if a in d:
            tag=1
            break
        else:d[a]=1
    if tag:continue
    print(i)
    exit(0)

추천

출처blog.csdn.net/qq_51408826/article/details/129466183