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)
Reference
이 문제에 관하여(Codeforces Round #614 Div2 A.ConneR and the A.R.C. Markland-N), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/recuraki/items/e9691556168338a4d51d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제는 매우 간단하니, 총결산하면 다음과 같다.
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)
Reference
이 문제에 관하여(Codeforces Round #614 Div2 A.ConneR and the A.R.C. Markland-N), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/recuraki/items/e9691556168338a4d51d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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))
이 문제에 대한 설명에 따르면 원래 이 문제로 인해 식당이 문을 닫는 리스트의 최대치는 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)
Reference
이 문제에 관하여(Codeforces Round #614 Div2 A.ConneR and the A.R.C. Markland-N), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/recuraki/items/e9691556168338a4d51d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)