티스토리 뷰
오늘부터 SWEA 문제를 풀어보기로 했다!
처음으로 풀어본 문제다! 수학적인 문제라고 생각하는데 생각도못하고 오~~래 틀렸다
이 문제는 부분합으로 배열을 구하면 각 층을 index라 생각할 수 있고
층에있는 수의 갯수를 psum[index] 라고 생각 할 수 있다
두 수 a,b가 들어왔을 때 우리는 무조건 작은수에서 큰수로 갈 것이다
그럼 위에서 아래로 내려오면 되는데 이때 삼각형을 정삼각형으로 l,r 두 방향으로 내려온다
현재 dep에서의 index를 사용하면 l,r을 구하기 쉽다!
dep는 lower_bound를 통해 구하면 된다
기본적으로 무조건 dep차이만큼은 가야한다!
큰 수와 같은 dep까지 왔을 때가 중요하다!
1) l<maxn 이라면 정삼각형 범위보다 안쪽에 있으므로 +(maxn-l)
2) maxn<r 이라면 +(r-maxn)
만큼 더해주면 된다!
만약 그 사이의 범위라면 dep차이가 답이다
두 개의 점을 포함하는 정삼각형을 그려보면 무조건 한 변의 길이로 갈 수 있다!
이상한 피라미드속의 삼각형이였다..!!
간만에 하니 어렵다..!!
[소스코드]
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
|
#include <iostream>
#include <algorithm>
using namespace std;
int psum[222];
int depth(int num){
return lower_bound(psum,psum+200,num) - psum;
}
int main(){
for(int i=1;i<=200;i++) psum[i] = psum[i-1]+i;
int tc; scanf(" %d",&tc); int c=1;
while(tc--){
int a,b; scanf(" %d %d",&a,&b);
int maxn = max(a,b), minn = min(a,b);
int dep = depth(minn), target = depth(maxn);
if(dep == target) printf("#%d %d\n",c++,abs(maxn - minn));
else {
int index = psum[dep] - minn;
int ans = target - dep;
int r = psum[target] - index;
index = dep - index;
int l = psum[target-1] + index;
if(maxn>r) ans+=(maxn-r);
if(maxn<l) ans+=(l-maxn);
printf("#%d %d\n",c++,ans);
}
}
}
|
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
[SWEA] 1824 혁진이의 프로그램 검증 (0) | 2020.01.12 |
---|---|
[SWEA] 9232 한길이의 생일 선물 (0) | 2020.01.12 |
[SWEA] 3752 가능한 시험 점수 (0) | 2020.01.12 |
[SWEA] 1249 보급로 (0) | 2020.01.11 |
[SWEA] 2819 격자판의 숫자 이어 붙이기 (0) | 2020.01.11 |
댓글