AIZU ONLINE JUDGE: アルゴリズムとデータ構造入門 トピック1

AOJの アルゴリズムとデータ構造入門 トピック1にチャレンジしました。

onlinejudge.u-aizu.ac.jp

 

 

アルゴリズムとデータ構造入門 トピック1

「プログラミング入門」編が完了したので「アルゴリズムとデータ構造入門」をやってみました。トピック1は入門編で、1_Aから1_Dまでの4問です。

 

トピック1

 

1_A:Insertion Sort

入力データをソートして昇順に並べる問題です。

昇順とは時の通り、数字が上に登っていくので、小さい値→大きな値のソートになります。

挿入ソートのプログラミング例がすでに記述されているので、この通りに実行すればPASSできました。

 

ソート実行例

「Post note」の一般解説を読むと挿入ソートが図でも説明されていますので比較的容易に解決できました。

 

1_B:Gratest Common Driver

1_Bは最大公約数を求める問題です。

これもヒントとして以下のように記載されているので、この通りに記述すれば、PASSできました。

 

ユークリッドの互除法は「xy のとき gcd(x,y) と gcd(y,xy) は等しい」という定理を用いて x と y の最大公約数を高速に求めるアルゴリズムです。

例えば、54 と 20 の最大公約数は以下のように求めることができます。
gcd(54,20)
=gcd(20,14)
=gcd(14,6)
=gcd(6,2)
=gcd(2,0)
=2

a,b=(int(x) for x in input().split())

if a>=b:
    aa = a
    bb = b
else:
    aa = a
    bb = b

cc = 1

while cc !=0:
    cc = aa%bb
    if cc ==0:
        print(bb)
    
    aa = bb
    bb = cc

 

1_C:Prime Numbers

いくつかの数値が素数かどうかを求め、素数がいくつあるのかを求める問題です。

一般解説をみると「素数判定では、「合成数  は  を満たす素因子 をもつ」」と記載されており、素数を見つけるには√xからx-1までで十分となっています。

ルートはmathモジュールで対応しました。

また、平方根のデータを整数にするため、math.ceilで小数点以下を切り上げました。

import math

#1回目の入力データの取得
num = int(input())

list_a = # 入力データを保存するため、空のリストを作成

#1回目に取得した入力データnum回分、データを取得し、リストに保存
for iii in range(num):
    list_a.append(int(input()))

#素数をカウントした値を保存する変数
count=0

#2からルートxまで +1して割り切れるかチェック
for iii in range(num):
    data = list_a[iii]
    root_x = math.sqrt(data)
    data_ceil = math.ceil(root_x)
    
    if data == 2 :
        count+=1

    for jjj in range(2,data_ceil+1):
        if jjj==2 and data%2==0:        #2で割り切れたら偶数なのでbreak
            break
        elif data%jjj==0 and jjj%2!=0 : #jjjで割り切れたらbreak
            break
        elif jjj==data_ceil and data%jjj!=0:
            count+=1

print(count)

 

1_D:Maximum Profit

入力データの値の差分がmaxになる値を求める問題です。

今までのMAX値と差分データの大きいほう、

今までのMIN値と差分データの小さいほう、 を実行することでPASSできました。

num = int(input())
list_a=
for iii in range(num):
    list_a.append(int(input()))

minv = list_a[0]
maxv = -10**10
for jjj in range(1,num):
    if maxv < list_a[jjj] - minv:
        maxv =list_a[jjj]-minv
    if minv > list_a[jjj]:
        minv = list_a[jjj]

print(maxv)

 

Completed

 

/* -----codeの行番号----- */