https://www.acmicpc.net/problem/2585
목적
다음 그림과 같이 S(=출발지: {0,0}), T(=도착지: {10000,10000}), 그리고 N개의 경유지가 있는데, M번을 경유하여 S에서 T로 가기위해 필요한 연료통의 최소 용량을 구하자.
접근법
1. 연료통의 용량을 1에서 S에서 T까지 가는데 필요한 양까지를 범위로 하는 이분탐색 알고리즘을 적용한다.
2. 제곱근을 구하는 오버헤드가 어느정도 존재하므로, 이 연산은 생략하고 진행한다.
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
32
33
34
|
#include<iostream>
#include<cstring>
#define DIST(a,b,c,d) ((a-c)*(a-c)+(b-d)*(b-d))
#define f(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
int a[1001][2]={{0,0}},n,k,lim,z[1001];
bool possible(int i,int cnt){
if(cnt<1)return false;
z[i]=1;
f(j,1,n)if((!z[j]&&DIST(a[i][0],a[i][1],a[j][0],a[j][1])<=lim)&&
(DIST(a[j][0],a[j][1],10000,10000)<=lim||possible(j,cnt-1)))return true;
return false;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
f(i,1,n)cin>>a[i][0]>>a[i][1];
int l=1,r=15000;
while(l<=r){
memset(z,0,sizeof(z));
int mid=(l+r)/2;
lim=mid*mid*100;
if(possible(0, k))r=mid-1;
else l=mid+1;
}
cout<<l;
}
|
문제 설명과 코드에 대한 피드백은 언제나 환영합니다.
다양한 의견 댓글로 남겨주세요.
'Problem Solving > BOJ 백준' 카테고리의 다른 글
[ BOJ 백준 3090번 - 차이를 최소로 ] 해설 및 코드 (0) | 2019.12.14 |
---|---|
[ BOJ 백준 15732번 - 도토리 숨기기 ] 해설 및 코드 (0) | 2019.12.13 |
[ BOJ 백준 2613번 - 숫자구슬 ] 해설 및 코드 (0) | 2019.12.13 |
[ BOJ 백준 1981번 - 배열에서 이동 ] 해설 및 코드 (0) | 2019.12.13 |
[ BOJ 백준 6073번 - Secret Message ] 해설 및 코드 (2) | 2019.12.13 |