해당 문제를 이해하기까지에 조금 시간이 걸린 것 같았다 처음에 생각했을땐 2개씩 서로 평균값을 비교해서
최소 값을 찾으면 되는줄 알았다 하지만 계속 보다보니 문제를 잘못 이해했다는걸 알았다
경기를 진행한다면
첫번째 코트에 2대2
두번째 코트에 2대2
이런 상황이 올 것이다
이것이 즉 한 게임이라고 가정하고 그 게임의 최소값 중 여러 조합을 백트래킹으로 돌면서
모든 게임을 다 체크하여 가장 큰 최소값을 찾아야하는 것이 이 문제의 핵심이다.
소수점 첫번째와 두번째를 체크하는 방법은
(결과 값에 10을 곱한 값) - floor(결과 값에 10을 곱한 값) 이렇게 뺏을때 값이 0이라면 더 이상 두번째 소수점이
나오지 않는다는 것이기 때문에 이 조건을 생각해서 풀었다
#include <iostream>
#include <climits>
#include <cmath>
using namespace std;
float mins = 0.0;
int arr[10];
int visit[10];
int num[10];
void func(int t) {
if(t == 8) {
float sum = 0;
float sum2 = 0;
float sum3 = 0;
float sum4 = 0;
float ss = 1.0;
sum += arr[0];
sum += arr[1];
sum2 += arr[2];
sum2 += arr[3];
sum /= 2.0;
sum2 /= 2.0;
sum3 += arr[4];
sum3 += arr[5];
sum4 += arr[6];
sum4 += arr[7];
sum3 /= 2.0;
sum4 /= 2.0;
ss = min(ss, float(1 - abs(sum - sum2) / 10.0));
ss = min(ss, float(1 - abs(sum3 - sum4) / 10.0));
mins = max(mins,ss);
return;
}
for(int i = 0; i < 8; i++) {
if(visit[i]) continue;
arr[t] = num[i];
visit[i] = 1;
func(t+1);
visit[i] = 0;
}
}
int main() {
for(int i = 0; i < 8; i++) {
cin >> num[i];
}
func(0);
cout << fixed;
if((mins * 10) - floor((mins * 10)) == 0) {
cout.precision(1);
}
else {
cout.precision(2);
}
cout << mins;
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 1874 실버2) 스택 수열 (0) | 2024.09.14 |
---|---|
백준 실버 5 - 1268) 임시 반장 정하기 - 구현 (0) | 2024.09.04 |
경북SW 한‧베 국제SW코딩경진대회 참가후기 (0) | 2024.09.02 |
백준 15683번 감시 (골드 3) 백트래킹, 시뮬레이션 (0) | 2024.07.19 |
백준 쿼드트리 흑백 압축 (1992 실버 1) 재귀 분할정복 (0) | 2024.07.12 |