[白俊]3020番犬糞虫



  • ソース:https://www.acmicpc.net/problem/3020

  • アルゴリズム:二分ナビゲーション

  • に答える
  • 地面上の障害物はそのままで、天井上の障害物入力(高さ-長さ)
  • ホタルが遭遇する障害物の個数をできるだけ高く計算する
  • 最低価格と最低価格の個数の
  • を求めます

  • 障害物計数法
    ソート
  • 計算する高さリスト
  • 二分探索により計算する現在の高さhと初対面の境界
  • を求める.
  • (高さhで遭遇する障害数x個、遭遇しない障害数-x個)
  • コード#コード#

    import sys
    
    
    def binary_search(length_list, curr_height, start, end):
        if start > end:
            return start
        mid = (start+end)//2
        if length_list[mid] < curr_height:
            return binary_search(length_list, curr_height, mid+1, end)
        else:
            return binary_search(length_list, curr_height, start, mid-1)
    
    
    def init():
        rock_num, height = map(int, sys.stdin.readline().rstrip().split(' '))
        top_list, bottom_list = [], []
        for i in range(rock_num):
            if i % 2 == 0:
                bottom_list.append(int(sys.stdin.readline().rstrip()))
            elif i % 2 == 1:
                top_list.append(height-int(sys.stdin.readline().rstrip()))
        return rock_num, height, top_list, bottom_list, float('inf'), 0
    
    
    rock_num, height, top_list, bottom_list, min_num, min_count = init()
    bottom_list.sort()
    top_list.sort()
    for h in range(height):
        bottom_meet = rock_num//2 - binary_search(bottom_list, h+0.5, 0, rock_num//2-1)
        top_meet = binary_search(top_list, h+0.5, 0, rock_num//2-1)
        if min_num == bottom_meet+top_meet:
            min_count += 1
        elif min_num > bottom_meet+top_meet:
            min_num = bottom_meet+top_meet
            min_count = 1
    print(min_num, min_count)