[BaekJoon]2529不等式
🔦 提问链接
▼▼私の草
브루트포스
で解決した問題最大値と最大値を1つ必要とするだけで、時間を節約するために前後にループできます.
汎用:
0 ~ 9
まで、数字を文字数より多く並べ替えます.MIN値
🛠 マイコード
import itertools
num=input()
sign = input().split()
val=[str(x) for x in range(10)]
per = list(itertools.permutations(val, int(num)+1))
flag = 0
min_v = '9999999999'
max_v = '-1'
for comp in per:
flag=0
for i in range(int(num)):
if sign[i]== '<' and comp[i] < comp[i + 1]:
flag += 1
elif sign[i]== '>' and comp[i] > comp[i + 1]:
flag += 1
else:
break
if flag == int(num):
min_v = min(min_v, str(''.join(comp)))
break
for k in range(len(per)-1,0,-1):
flag=0
for i in range(int(num)):
if(sign[i]=='<' and per[k][i] < per[k][i+1]):
flag += 1
elif(sign[i]=='>' and per[k][i] > per[k][i+1]):
flag += 1
else:
break
if flag == int(num):
max_v = max(max_v, str(''.join(per[k])))
break
print(max_v)
print(min_v)
▼▼▼その他▼▼▼
より効率的です.
DFSが中間が不可能であると判断した場合,これらはすべて除外される.(場合によっては大幅に削減可能)
0 ~ 9
に繰り返し、이미 있는 값
と부등호에 만족하는 값
の認知を検査し、次のステップを行う.idx
が条件を満たす場合、最大、最小値が更新されます.🛠 その他のコード
import sys
n = int(input())
oper = input().split()
check = [False] * 10
v = []
mn = sys.maxsize
mn_str = ""
mx = -1
mx_str = ""
def possible(i):
if oper[i - 1] == '>' and v[i - 1] < v[i]:
return False
elif oper[i - 1] == '<' and v[i - 1] > v[i]:
return False
return True
def dfs(idx):
global mn, mx, mn_str, mx_str
if idx == n + 1:
v_str = ''.join(map(str, v))
val = int(v_str)
if mn > val:
mn = val
mn_str = v_str
elif mx < val:
mx = val
mx_str = v_str
return
else:
for i in range(10):
if check[i] is True:
continue
check[i] = True
v.append(i)
if idx == 0 or possible(idx):
dfs(idx + 1)
check[i] = False
v.pop()
dfs(0)
print(mx_str)
print(mn_str)
📝 整理する
🎈 リファレンス
黄牛開発者ブログ
Reference
この問題について([BaekJoon]2529不等式), 我々は、より多くの情報をここで見つけました https://velog.io/@pyh8618/BaekJoon-부등호テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol