KUPC 2015 A 東京都 と ABC 103 D - Islands War

https://qiita.com/drken/items/e77685614f3c6bf86f44

続きです。

区間スケジューリングの問題がメインです。

区間スケジューリングは、個々の区間に、少なくとも 1 つ垂直に棒が刺さっている状態にするには、最小で何本必要ですかという問題らしい。けんちょんさんのブログが、めちゃめちゃわかりやすい。

東京都は、区間スケジューリングっていう感じはしなかった。ただ貪欲にって感じ。以下解答

https://atcoder.jp/contests/kupc2015/tasks/kupc2015_a

def ans(s):
    a, b = 'kyoto', 'tokyo'
    i = 0
    ans = 0
    while i < len(s):
        if s[i:i+len(a)] == a:
            i += len(a)
            ans += 1
        elif s[i:i+len(b)] == b:
            i += len(b)
            ans += 1
        else:
            i += 1
    return ans


def main():
    n = int(input())
    for i in range(n):
        s = input()
        print(ans(s))


if __name__ == '__main__':
    main()

Islands War

https://atcoder.jp/contests/abc103/tasks/abc103_d

問題概要

水平にいくつか点がある。その点はどれも、両端の点と線で繋がっている。任意の数の 2 点の組み合わせが与えられるので、線を消して、その 2 点が線を通じて繋がらないようにしてほしいらしい。そのとき、最小で何本線を消せば良いか。

解答

def main():
    n, m = [int(i) for i in input().split()]
    abc = []
    for i in range(m):
        a, b  = [int(j) for j in input().split()]
        abc.append([a,b])
    abc.sort(key=lambda x:x[1])
    i = 1
    ans = 1
    now = abc[0]
    while i < m:
        if now[1] <= abc[i][0]:
            ans += 1
            now = abc[i]
        i += 1
    print(ans)

if __name__ == '__main__':
    main()