티스토리 뷰
기본적인 이분매칭이었습니다.
solved.ac 티어: 플래티넘 3
일단 이문제는 이분매칭 문제이기 때문에 이분매칭을 할수있어야 한다. 열혈강호 문제를 풀어보고 오자.
이 문제를 풀고 왔다면 이제 풀이를 설명하겠다.
문제 설명에 상어 A의 크기, 속도, 지능이 상어 B의 크기, 속도, 지능보다 크거나 같다면 상어 A는 상어 B를 먹을 수 있다
능력치가 모두 같은 상어 A, B가 있다면 A가 B를, B가 A를 잡아먹을 수는 있지만 A, B가 서로 잡아먹을수는 없다.
이렇게 써있는데 이러면 입력을 받고 2중반복을 하면서 배열에 한쪽이 크기,속도,지능이 더 크다면 해당하는 위치에 넣고 반대쪽이 더 크면 반대쪽의 해당하는 위치에 넣으면 된다. 만약 3개 다 같을경우 아무곳이나 넣어도 상관없다
그리고 한 상어가 최대 두 개의 상어만 먹을 수 있게 했다. 이라도 되어있기 때문에 이분매칭을 실행하는 코드를 2번 반복해주고 이때 나오는 값은상어가 죽는 수중 최댓값이기 때문에 N-최댓값을 해주면 맞았습니다가 뜬다.
import sys
def dfs(x):
for i in range(len(l[x])):
y=l[x][i]
if t[y]:continue
t[y]=True
if q[y]==0 or dfs(q[y]):
q[y]=x
return False
return True
input=sys.stdin.readline
a=int(input())
m=[list(map(int,input().split())) for i in range(a)]
l=[[] for i in range(91)]
for i in range(a):
for g in range(i+1,a):
if m[i][0]==m[g][0] and m[i][1]==m[g][1] and m[i][2]==m[g][2]:l[i+1].append(g+1)
elif m[i][0]>=m[g][0] and m[i][1]>=m[g][1] and m[i][2]>=m[g][2]:l[i+1].append(g+1)
elif m[g][0]>m[i][0] and m[g][1]>m[i][1] and m[g][2]>m[i][2]:l[g+1].append(i+1)
q=[0]*101
t=[0]*101
cnt=0
for qt in range(1):
for i in range(a):
t=[False]*101
if dfs(i+1):cnt+=1
print(a-cnt)
(원래 코드 가독성을 무시하고 짜니 이해부탁립니다)
'ps' 카테고리의 다른 글
BOJ 19851(버거운 버거)풀이 (0) | 2021.01.07 |
---|---|
BOJ 1017(소수 쌍) 풀이 (0) | 2021.01.06 |
Codeforces Round #693 (Div. 3) 풀이 (2) | 2021.01.06 |
BOJ 9345(디지털 비디오 디스크(DVDs)) 풀이 (0) | 2021.01.05 |
백준 18186(라면 사기 Large)풀이 (2) | 2021.01.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자료구조
- 최소 스패닝 트리
- 구현
- discord bot
- 자료 구조
- 이분매칭
- C++
- 트리
- 그래프 이론
- 개발
- 이분 탐색
- 깊이 우선 탐색
- 트리에서의 다이나믹 프로그래밍
- 정렬
- KOI
- Python
- 누적 합
- 느리게 갱신되는 세그먼트 트리
- 그래프 탐색
- 다이나믹 프로그래밍
- codeforces
- 그리디 알고리즘
- A Dance of Fire and Ice
- 세그먼트 트리
- 완전 탐색
- 알고리즘
- BOJ
- 수학
- 잡봇
- 선분 교차 판정
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함