Atcorder ABC 246에서 nump를 사용하려고 합니다.
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 함수의 존재를 아는 수확.
Reference
이 문제에 관하여(Atcorder ABC 246에서 nump를 사용하려고 합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ark_sakura/articles/56f1a5c072f233텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)