Atcorder ABC 246에서 nump를 사용하려고 합니다.

16096 단어 PythonAtCodertech
numby에 익숙해지려고 numby로 쓰는 방법을 강행하는 등 다양한 시도를 하며 어려움을 겪었다.

C - Coupon


해법을 생각하면 numby 방송의 사칙 연산을 사용하여 솔직하게 쓸 수 있다.
for문,list 패키지를 표시하지 않고 쓸 수 있습니다.
np.나는 선택이 없어도 괜찮다고 생각하지만np.sort 사용 시 신중을 기하기 위해 사용합니다.
ABC246C.py
import numpy as np
n,k,x=map(int,input().split())
a=np.array(list(map(int,input().split())))
div=a//x
divsum=np.sum(div)
if divsum>=k:
    print(np.sum(a)-k*x)
    exit()
k=k-divsum
if k>=n:
    print(0)
    exit()
mod=a%x
mod=np.sort(mod,kind="stable")
print(np.sum(mod[:n-k]))

D - 2-variable Function


나는 엉망진창으로 빠져들었다.처음엔 넘비 해법의 아이디어를 떠올렸을 때 쉽게 쓸 수 있을 줄 알았는데 중간에 쓸모없는 족쇄로 풀리는 느낌이 들었다.솔직히 공식 해법을 보면 간단하지만 틀린 것이 없다.
a1을 추가하면 조건이 충족되기 전에 b를 계속 줄이고 a1을 추가하면...다음 b의 초기 값 후보는 이전 for문 순환에서 구한 b의 값입니다.이러한 이전 상태에 따라numby로 다음 값의 양을 계산하기 어렵다.이렇게 계산할 수 있는 건 pnp야.cumsum、np.cumprod 정도?따라서 b의 증감을 탐색하게 하는 것이 아니라 O(1) 대수로 구하는 것이다.a의 후보를arange 함수를 생성한 후 a^{3]+a^{2}b+ab^{2]+b^{3]-n=0을 b에 대한 3차례식으로 보고 해답을 합니다.[3차 방정식] [풀이된 공식]으로 읽어들이면 복잡한 공식이 나타나지만 직접 입력됩니다.
...잘못 1루트에서 마이너스인 모양.실수해를 원하기 때문에 허수해를 쓸 필요가 없을 것이다.타자 오류를 의심하고 다른 페이지도 비교해 보세요wikipedia그러면 3승근 앞의 기호는 다르지만 둘 다 표기 오류가 있다고 보기 어렵고 다시 써봐도 오류가 사라지지 않는다.나는 많은 것을 찾았는데, 어느 페이지가 잊어버렸는지 알았지만, 3곱하기 뿌리에는 마이너스가 있을 수 있었다.만약 루트 번호가 음수라면 허수이고\sqrt[3]{-1]=-1이므로 3곱하기 루트의 기호는 음수라도 실수이다.하지만np.파워 함수가 음수 값을 입력할 때 오류가 발생하기 때문에 절대 값을 입력하고 루트 번호의 기호를 꺼내야 합니다.이것을 알아차리는 데 많은 시간이 걸렸다.
다음 미치광이는 넘침이다.입력 예 3, 10^ {18}에 가까운 수량을 입력할 때 이상한 값을 출력합니다.64비트 정수 범위 내에서 계산하려고 했는데 다방면의 조사를 통해 3차 방정식의 해를 사용하는 공식이 넘쳐나는 것 같았다.numby의dype를 int에서flat로 바꾸면 정확한 값이 되지만flat의 유효한 숫자가 15자리라면 18자리의 입력 정밀도가 부족합니다.풀이된 공식에서 구한 b의 값을 정수화하고 a^{3]+a^{2}b+ab^{2]+b^{3}가 n보다 작으면 b+1으로 설정하면 됩니다. 이렇게 고려하지만 정밀도가 부족하기 때문에 예3의 정답을 입력하지 않았을 것입니다.b+2를 감안하여 답이 마침내 맞았다.
ABC246D.py
import numpy as np
import math
import sys
n=int(input())
if n==0:
    print(0)
    sys.exit()
aupper=pow(n,1/3)
aupper=math.floor(aupper)
if pow(aupper,3)<n:
    aupper+=1
alower=pow(n/4,1/3)
alower=math.floor(alower)
if 4*pow(alower,3)<n:
    alower+=1

def func(a,b):
    return (a+b)*(a*a+b*b)

def cardano(a,b,c): #カルダノの公式の実数解
    s1=(27*c+2*a*a*a-9*a*b)/54
    s4=(3*b-a*a)/9
    t1=-s1+np.sqrt(s1*s1+s4*s4*s4)
    tsign=np.sign(t1) #np.signで符号を取得
    t1=tsign*np.power(np.abs(t1),1/3) #np.powerの外に符号を出す
    t2=-s1-np.sqrt(s1*s1+s4*s4*s4)
    tsign=np.sign(t2)
    t2=tsign*np.power(np.abs(t2),1/3)
    x=t1+t2-a/3
    return x

a=np.arange(alower,aupper+1,dtype=np.int64) #aの取りうる範囲
af=a.astype(np.float) #カルダノの公式計算用にはfloatを使う
b=cardano(af,af*af,af*af*af-n)
b=np.where(b<0,0,b) #b<0の解は不要
b=np.floor(b).astype(np.int64)
x1=func(a,b)
x2=func(a,b+1)
x3=func(a,b+2)
x=np.where(x1>=n,x1,x2)
x=np.where(x>=n,x,x3) #b+2まで考慮しないと正解にならない
print(np.amin(x))
포문을 쓰지 않고 억지로 numby로 처리했지만 똑똑하지 않아요.pypy의 제출에 비해도 그리 빠르지 않다(200ms 정도).numby를 억지로 사용할 필요가 없다는 문제를 뼈저리게 느꼈다.기호를 구하다.sign 함수의 존재를 아는 수확.

좋은 웹페이지 즐겨찾기