1. 1次元3次方程式の解法
もちろん、この質問は純粋に二点だけではないと思いますが、その二点の中に含まれております。
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はタイムアウトしませんでした
Python では、バイナリ右シフト演算に >>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)
3、数値の範囲
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)
五、四平方和
ここでバイナリ+配列を使うとタイムアウトしてしまうので、ここでは辞書を使います
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:Python独自のライブラリ関数を使うだけ
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)