Codeforces Round #614 Div2 A.ConneR and the A.R.C. Markland-N

11375 단어 codeforces

반성하다.


문제를 보지 않았기 때문에 필요한 실시(해법2)에 대해 뚜렷하게 무거운 실장(해법1)을 했기 때문에 스스로 경계한다.

제목의 뜻


문제는 매우 간단하니, 총결산하면 다음과 같다.
n階建ての建物があり、すべての階にはレストランがある。
あなたのオフィスはs階にある。
ところが、k個の階でレストランが工事中である。
一番近い回転中のレストランとは何フロア離れているか?
※1: k <= 1000
In/Out의 예 보기
n,s,k = 100 76 8
kの配列 76 75 36 67 41 74 10 77
100층 건물, 사무실 76층, 시공 중인 층(sort 만들기)10 36 41 67 74 75 76(オフィス) 77이 있습니다.
사무실의 위층은 78층, 아래층은 73층으로 가깝고 78층으로 가면 됩니다2.

해법 1: 정렬된 배열 앞뒤 검색


상술한 실시를 간단히 진행하다.다음 그림은 이미지입니다.
1. kの配列をソートし、sの位置を知る。
   尚、sが存在しない場合、答えは`0`(移動しなくていい)である。)
2. 配列を左方向に見る。差が1である限り左に進んでいく。
3. 差が1よりも大きい場合、その間のレストランはすべて開いているので、一番sに近い階が下に降りた場合に最も近いレストランである。
  (図では76から下り、74の次は67であるため、68-73階のレストランは空いている)
4. 2,3において、下に降りても開いているレストランが存在しないことがある。
  (例えば、2階にオフィスがあり、1,2階のレストランが閉まっている場合、下に答えはない)
5. 上記を同様に右方向(上側)にも探索する
6. 上にも下にも候補となるレストランがあるならminをとり、片方がしか候補がないならそれを答えとする
이것을 실시한 것은 다음과 같다.
q = int(input())
for qq in range(q):
    res = -1
    n, s, k = map(int, input().split())
    dat = list(map(int, input().split()))
    dat = list(set(dat)) # 題意的にある階がリストに複数回含まれる時の対策 [2,2,3]等
    dat.sort()
    if s not in dat: # もし、sがリストにないなら、sの階のレストランは開いている
        print(0)
        continue
    ind = dat.index(s) # sの入っているインデックスを取得
    r = l = -1 # 下方向(l)も上方向(r)も見つかっていないことにする
    # 上方向の探索
    for i in range(ind + 1, len(dat)): # sの一つ上のインデックスから最上階まで探索
        if (dat[i] - dat[i - 1]) != 1: # もし、差が1出ないなら
            r = dat[i - 1] + 1 # 上向きはその区間の一番低い階が候補
            break
    if r == -1 and dat[-1] != n: # もし、連続した階しかなく、しかし、リストの最後が最上階でないなら
        r = dat[-1] + 1 # リストの一番上の階の上が候補となる

    # 同様の処理を下方向にも行う
    for i in range(ind - 1, -1, -1):
        if (dat[i + 1] - dat[i]) != 1:
            l = dat[i + 1] - 1
            break
    if l == -1 and dat[0] != 1:
        l = dat[0] - 1

    if r == l == -1: # 題意より開いているレストランがないことはない()
        print("ERROR")
    elif r == -1: # 上方向に候補がないなら
        print(s - l) # 答えは下方向
    elif l == -1: # 下方向に候補がないなら
        print(r - s)
    else: # 上も下も候補があるなら差が小さいほう
        print(min(s - l, r - s))

해법 2: 정렬하지 않고 목록만 검색


이 문제에 대한 설명에 따르면 원래 이 문제로 인해 식당이 문을 닫는 리스트의 최대치는 1000(※ 1 참조)이라고 적혀 있다.
따라서 s를 중심으로 500층의 분류 목록에 존재하는지 확인하면 된다.
1천개 요소 목록을 500회 정도 탐색하기 때문에 순서와 이분 탐색이 필요 없다.따라서 다음은 AC입니다.
q = int(input())
for qq in range(q):
    n, s, k = map(int, input().split())
    dat = list(map(int, input().split()))
    res = 0 # オフィスの位置からのdelta
    while True:
        if (s + res) not in dat and (s + res) <= n: break # 上方向
        if (s - res) not in dat and (s - res) >= 1: break # 下方向
        res += 1
    print(res)

좋은 웹페이지 즐겨찾기