1044번 - 팀 선발
코드가 좀 길어서 주석을 달았습니다
기본적인 아이디어는 입력받은 배열을 반으로 나누고 각각에 대해
(팀1의 점수 - 팀2의 점수 , 해당 차이를 만드는 선별 상태 비트마스킹 중 최솟값) 을 모두 구해놓고
배열 1과 배열 2에서 저 차이를 더해서 0에 최대한 가까워야 되므로
배열 1의 원소를 하나씩 보면서 (차이값 * -1) 한 값을 배열 2에서 이분탐색으로 찾습니다.
상태 1과 상태 2를 하나로 합쳐서 (전체 차이, 상태) 를 만들고 최종적인 답과 비교하여 갱신해줍니다.
upper_bound로 찾았으므로 그 근방의 값을 1~2개 정도 더 고려해서 답을 갱신해줍니다.
배열1의 원소에 첫 번째 원소부터 높은 비트를 부여하였고 팀 1이되면 비트를 켜지 않음, 팀2가 되면 해당 비트를 켬 으로 정하였습니다.
4
50 50 50 1
30 30 30 150
답은 1 2 2 1가 출력이 되어야 합니다.
댓글을 작성하려면 로그인해야 합니다.
p_ce1052 3년 전
코드가 좀 길어서 주석을 달았습니다
기본적인 아이디어는 입력받은 배열을 반으로 나누고 각각에 대해
(팀1의 점수 - 팀2의 점수 , 해당 차이를 만드는 선별 상태 비트마스킹 중 최솟값) 을 모두 구해놓고
배열 1과 배열 2에서 저 차이를 더해서 0에 최대한 가까워야 되므로
배열 1의 원소를 하나씩 보면서 (차이값 * -1) 한 값을 배열 2에서 이분탐색으로 찾습니다.
상태 1과 상태 2를 하나로 합쳐서 (전체 차이, 상태) 를 만들고 최종적인 답과 비교하여 갱신해줍니다.
upper_bound로 찾았으므로 그 근방의 값을 1~2개 정도 더 고려해서 답을 갱신해줍니다.
배열1의 원소에 첫 번째 원소부터 높은 비트를 부여하였고 팀 1이되면 비트를 켜지 않음, 팀2가 되면 해당 비트를 켬 으로 정하였습니다.