初中級者が解くべき過去問精選 100 問 茶コーダーが解いてみた #1 ( 全列挙編 )

今日から "初中級者が解くべき過去問精選 100 問"
全て解ききってみたいと思います!

精選100問って何?

記事はこちら!
qiita.com
こんなに丁寧にまとめてくださっている e869120 さんには本当に感謝しかないです。

記事を上げるタイミングは、この問題は100問ありますが、細かく分野ごとに分かれていますので、分野ごとに全て時終わったら書いていきたいと思います。

今日はその第1回目!!

全探索:全列挙

この全探索の分野は全部で4問あるので、全て紹介したいと思います!

1. How many ways?

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B&lang=ja

Nの制約が小さい時に全探索の発想を常にするようにしたいです。
(100とか1000くらいの時)

while True:
    n,x = map(int,input().split())
    ans = 0
    if (n,x) == (0,0):
        break
    for i in range(1,n-1):
        for j in range(i+1,n):
            for k in range(j+1,n+1):
                if i+j+k == x:
                    ans += 1
    print(ans)

2. B - 105

https://atcoder.jp/contests/abc106/tasks/abc106_b

数学的にも素因数分解して個数から判別できますが、
全探索の方が圧倒的に早いので全探索!!
解法は約数列挙して、個数が8個ならカウントする感じです。

n = int(input())
cnt = 0
for i in range(1,n+1,2):
    ans = []
    for j in range(1,int(i**0.5) + 1):
        if i%j == 0:
            ans.append(j)
            if j**2 != i:
                ans.append(i//j)
    if len(ans) == 8:
        ans.sort()
        cnt += 1
print(cnt)

3. B - ATCoder

https://atcoder.jp/contests/abc122/tasks/abc122_b

高々文字列の長さが10なので困ったら全探索!!

s = input()
ans = cnt = 0
ch = ["A","G","C","T"]
for i in range(len(s)):
    if s[i] in ch:
        cnt += 1
    else:
        cnt = 0
    ans = max(ans,cnt)
print(ans)

4. C - カラオケ

https://atcoder.jp/contests/pakencamp-2019-day3/tasks/pakencamp_2019_day3_c

これは少し苦戦しました、、、
今までの3問とは違って3重for文で回さなければいけないのでしばらく考えました。
1重目は1曲目に歌う曲を決め、
2重目は2曲目に歌う曲を決め、
3重目は決まった曲をN人の生徒が歌ったらどうなるのかを調べていきます。
骨のある問題でしたが、面白かったです!!

n,m = map(int,input().split())
a = [[] for _ in range(n)]
for i in range(n):
    a[i] = list(map(int,input().split()))
ans = 0
score = [0]*n
for i in range(m-1):
    for j in range(i+1,m):
        for k in range(n):
            score[k] = max(a[k][i], a[k][j])
        ans = max(ans, sum(score))
print(ans)

最後に

まだまだスタートラインですが、なるべくハイペースで解いて進めていきたいです!!