[SWEA] 4012. [シミュレーションソフトウェア能力テスト]シェフ
9412 ワード
📚 質問する
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeUtVakTMDFAVH&categoryId=AWIeUtVakTMDFAVH&categoryType=CODE&problemTitle=4012&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1
自分の好きな食べ物を選ぶので、組み合わせです.
食べ物を選ぶ場合を考えてみましょう.だから組み合わせです.
食材が4種類ある場合は以下の通りです.
0 0 1 1
0 1 1 0
0 1 0 1
1 0 0 1
1 0 1 0
1 1 0 0
このとき
0 0 1 1
と1 1 0 0
は同じである.そのため、半分以上の価格は除去されます.このため、左端または右端または片側が0のみであることが確認できます.
最後に引いた回数を除いて、その時は0万として半分しか確認しませんでした.
組み合わせを選んで、当時の食べ物を訪問中に入れます.
以上のように,半分を選ぶ関数を実現し,味の違いを求める値引関数を構築する.
与えられた食物の2次元配列では,2つのドアを回し,配列にアクセスすることによってiとjの両方が選択されたかどうかを確認した.
どちらも0のときと1のときを合わせて減らすので、1つの変数を宣言し、両方を選んだら加算し、どちらも選ばなければ削除します.
この倹約値がglobalと宣言された値より小さい場合、更新されます.
📒 コード#コード#
def taste(): # 맛 차이의 절댓값
global min_result
result = 0
for i in range(n):
for j in range(n):
if visited[i] and visited[j]: # 고른 걸 더해주고
result += arr[i][j]
elif visited[i] == 0 and visited[j] == 0: # 안 고른 걸 빼준다.
result -= arr[i][j]
min_result = min(min_result, abs(result)) # 최솟값으로 초기화
return
def recur(cur, num):
if num > n // 2: # 절반을 넘게 고르는 경우는 종료
return
# 0011 1100처럼 대칭되면 같으므로 가장 큰 자릿수가 0일 때만 뽑는다.
if cur == n - 1: # 절반을 고르면 taste()를 돌고 종료, 아니면 그냥 종료
if num == n // 2: # 절반을 고르는 경우만
taste()
return
recur(cur + 1, num) # 선택하지 않는 경우
visited[cur] = 1
recur(cur + 1, num + 1) # 선택하는 경우
visited[cur] = 0
t = int(input())
for tc in range(1, 1 + t):
n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
visited = [0 for _ in range(n)]
min_result = 10000000
recur(0, 0)
print(f'#{tc} {min_result}')
🔍 結果
Reference
この問題について([SWEA] 4012. [シミュレーションソフトウェア能力テスト]シェフ), 我々は、より多くの情報をここで見つけました https://velog.io/@yunhlim/SWEA-4012.-모의-SW-역량테스트-요리사テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol