동적 (대화 형) 그래프 (Jupyter + ipywidgets interact)

경기 프로그래밍의 문제를 풀기 위하여는, 둘레를 붙이는 데 있어서 그림은 유효하게 되는 케이스가 많다. 이 때 입력 값을 변경하면 더욱 효과적입니다. jupyter를 사용하면 다음과 같은 인터페이스를 즉시 실현할 수 있습니다.


소재



Educational Codeforces Round 80 A.Deadline htps : // 코데후레세 s. 코 m / 안녕 st / 1288 / p 여과 b m / 아
N, d, x가 1 이상의 양의 정수이고 $ d\leq x $이면 다음을 만족하는 x가 있는지 확인하십시오.
$$ n\geq\left\lceil\frac{d}{x+1}\right\rceil + x $$ 여기서 $\lceil a\rceil$ 는 (가우스 함수가 ​​아닌) a 이상의 최소 정수입니다. 예 (예 : 3.1이면 4, 3이면 3)

정적 그림



문제의 샘플에서 NO, YES가 되는 예를 각각 왼쪽, 오른쪽에 나타낸다. 이것은 단순히 matplotlib 기능을 사용하는 경우에 잘 빨리 거는.

파랑이 $y=n$의 선이고 노랑이 $ y=\left\lceil\frac{d}{x+1}\right\rceil + x $, 녹색은 천장 함수를 적용하기 전의 플롯이다.

이와 같이 나타내면 青の線と黄色の線の交点が存在するかでYES/NOが決まる 를 알 수 있다. (물론 부등식이기 때문에 이것은 자명하지만 ...)
%matplotlib inline
import matplotlib.pyplot as plt
from ipywidgets import interact
import numpy as np

fig, (axL, axR) = plt.subplots(ncols=2, figsize=(10,4))

n,d = 5,11
xaxis = yaxis = 8
x = np.linspace(1, n, num = 100)
y1 = [n] *100
y2 = np.ceil(d / (x + 1) ) + x
y3 = d / (x + 1) + x
axL.plot(x, y1)
axL.plot(x, y2)
axL.plot(x, y3)
axL.set_xlim(0, xaxis)
axL.set_ylim(0, yaxis)
axL.grid(True)

n2,d2 = 5,4
xaxis = yaxis = 8
x2 = np.linspace(1, n2, num = 100)
y21 = [n2] *100
y22 = np.ceil(d2 / (x2 + 1) ) + x2
y23 = d2 / (x2 + 1) + x2
axR.plot(x2, y21)
axR.plot(x2, y22)
axR.plot(x2, y23)
axR.set_xlim(0, xaxis)
axR.set_ylim(0, yaxis)
axR.grid(True)

fig.show()

동적 그림



interact를 사용하면 n, d를 가변으로 움직이는 슬라이더가 생깁니다.


%matplotlib inline
import matplotlib.pyplot as plt
from ipywidgets import interact
import numpy as np

d = 20
n = 20
import math

xaxis = yaxis = 20
nlimit = 20
dlimit = 100

@interact(n=(1, nlimit), d = (1,dlimit))
def f(n, d):
    x = np.linspace(1, n, num = 100)
    y1 = [n] * 100
    y2 = np.ceil(d / (x + 1) ) + (x)
    y3 = d / (x + 1) + x
    plt.xlabel("x-axis")
    plt.ylabel(" y-axis")
    plt.plot(x, y1)
    plt.plot(x, y2)
    plt.plot(x, y3)
    plt.xlim(0, xaxis)
    plt.ylim(0, yaxis)
    plt.grid(True)
    plt.figure(figsize=(1,1))
    plt.show()

좋은 웹페이지 즐겨찾기