AtCoder에서 Juria 사용

11030 단어 JuliaAtCoderidea

배경.


지금까지 C++는 AtCoder에 참가했지만 평소에 사용하지 않았던 C++는 그 동안 켜자마자 잊어버려서 줄리아로 갈아타고 싶습니다.
ABC 186에 대한 질문에 답해 보려고 합니다.여기서는 코드의 설명, 알고리즘 등의 해설이 주로 진행되기 때문에 공식 해설을 보십시오.

A 문제


이 문제는 N을 W로 나누면 됩니다. 간단하지만 입력과 출력은 좀 번거롭습니다.
	N ,W = readline |> split .|> x -> parse(Int16,x)
	println(N)
이렇게 쓰면 가독성이 높아질 것 같아요.
다음과 같이 함수화할 수도 있다.
	function main()
		N ,W = readline() |> split .|> x -> parse(Int16,x)
		println(N÷W)
	end
	main()

질문


다음 문제는 송어에 곱한 덩어리의 수를 나타내는 배열 A의 최소치입니다.
$$
총 블록 수 - 최소값×격자
$$
계산하면 돼.직감적으로 이걸 쓰면...
function main()
    H ,W= readline() |> split .|> x -> parse(Int,x)
    A=Array{Int,2}(undef,H,W)
    for i in 1:H
        A[i,:]= readline() |> split .|> x -> parse(Int,x)
    end
    Amin=min(A...)
    Asum=sum(A)
    println(Asum-Amin*H*W)
end
main()
그렇게 되겠지.그런데 여기 문제가 있어요.주리아는 콜럼모어 order.
function main()
    H ,W= readline() |> split .|> x -> parse(Int,x)
    A=Array{Int,2}(undef,W,H)
    for i in 1:H
        A[:,i]= readline() |> split .|> x -> parse(Int,x)
    end
    Amin=min(A...)
    Asum=sum(A)
    println(Asum-Amin*H*W)
end
main()
더 빠릅니다.실제로 AtCoder 측정을 통해 전자는 381ms, 후자는 351ms로 측정됐다.즉, 10%가량 속도가 빨라져 D, E, F 문제는 주의가 필요할 수 있다.

C 문제


이건 포리에서 어리석게 다 찾아보는 게 좋겠지.Juria에는 string 함수의 키워드base가 있으며 몇 진수로 표시할 수 있습니다.이것을 사용하면 다음과 같습니다.
function main()
    N=readline() |> x -> parse(Int,x)
    count=0
    for i in 1:N
        if '7' in string(i, base=8) || '7' in string(i, base=10)
            count+=1
        end
    end
    println(N-count)
end
main()
여기서 가장 중요한 것은 첫 줄이 split에서 떨어지는 것이다.이걸 하지 않으면 N이 1성분의 배열이 되어 for i in 1:N에 error에서 나온다.

질문


이 문제는 배열 A에 대한sort를 통해 절대치를 피하는 것이 중요하다는 것이다.sort 뒤의 정렬을\tild{A}(오름차순)로 설정하면
\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\left| A_i-A_j\right|
=
\sum_{i=1}^{N-1}\sum_{j=i+1}^{N}\left(\tilde{A}_j -\tilde{A}_i\right)_.
내부\sum 실행 후
\sum_{i=1}^{N-1}\left(\sum_{j=i+1}^{N}\tilde{A}_j -\left( N -i\right)\tilde{A}_i\right)_.
나는 이것을 실제로 실시할 것이다.
function main()
    N=readline() |> x -> parse(Int,x)
    A=Array{Int,1}(undef,N)
    A=readline() |> split .|> x -> parse(Int,x)
    sort!(A) # 小さい順
    out=0
    B=0
    for j in N:-1:2
        B+=A[j]
        out+=B-(N-j+1)*A[j-1]
    end
    println(out)
end
main()
여기서 조금만 힘내자\sum{j=i+1}^{N}\tilde{A}_j의 부분을 변수 B로 정의하고 for 문장을 N에서 1로 바꿉니다.

끝맺다


이번에는 ABC 186의 D 문제를 주리아로 해결했다.지금까지 경기에서 E문제 이상을 풀지 못했기 때문이다.지금 시작
  • readline() |> x -> parse(Int,x)와 같이 입력과 출력도 읽기 쉬운 지정을 하기 쉽다.
  • 줄리아는 C++ 등보다 메모리 소비를 억제하기 어렵지만, D 문제라면 무의식적으로 쓸 수 있다
  • 알겠습니다.그러나 대량의 메모리를 사용한 도표 문제는 이번 경기에 진출하지 못했다.
    다음에 도표 문제를 실시하고 싶습니다.

    좋은 웹페이지 즐겨찾기