https://codeforces.com/contest/1624/problem/C
시간 3초, 메모리 256MB
input :
output :
조건 :
연산의 횟수로는 0번 아무 것도 하지 않을 수도 있음.
결국 연산을 수행하긴 해야한다. 이 조건을 잘 생각해야 한다.
1 ~ n까지를 다 가지고 있을 때 "1" 원소의 개수가 2개 이상이 되는 경우 "NO"를 출력해야 한다.
동일한 원소가 있는 경우에는 2개 이상인 경우에 계속 연산을 수행한다.
위와 같은 조건을 가지고 계산을 한다면 옳은 답을 얻을 수 있다. 동일한 원소의 값을 계속 축적해나가는 방식이고 배열을 이루는 원소의 개수가 최대 50이기 떄문에 해당 원소가 최대값이고 50개가 있다 하더라도
log (10 ^ 9) * 50 => 450 밖에 안 나오는 걸 보면 충분히 연산을 수행해도 된다.
import sys
from math import floor
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
data = list(map(int, sys.stdin.readline().split()))
idx, total = [0] * (n + 1), 0
for item in data:
if item < n + 1:
idx[item] += 1
total += 1
if idx[1] > 1:
print("NO")
continue
while idx[1] <= 1 and idx[1:].count(0):
for i in range(len(data)):
item = data[i]
if item == 1 or (item < n + 1 and idx[item] == 1):
continue
if item < n + 1 and idx[item] > 1:
idx[item] -= 1
data[i] = floor(item / 2)
idx[data[i]] += 1
continue
data[i] = floor(item / 2)
if data[i] < n + 1:
idx[data[i]] += 1
if idx[1] > 1:
print("NO")
else:
print("YES")