https://www.acmicpc.net/problem/1669
1669번: 멍멍이 쓰다듬기
동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그러다 오늘도 어김없이 그의 영원한 라이벌 멍멍이를 만나게 되었다. 원숭이는 멍멍이를 쓰다듬고 싶었다. 하지만 원숭이는 멍멍이보다 키가 작기 때문에 멍멍이를 쓰다듬어줄 수 없다. 원숭이가 멍멍이를 쓰다듬으려면 둘의 키가 같아야 하기 때문이다. 그래서 원숭이는 그 날부터 자신의 키를 조절하기로 마음먹었다. 원숭이는 초능력자이기 때문에 마음대로 키를 늘릴 수 있다. 하지만 안타깝게도 사람이 아니라
www.acmicpc.net
수열을 찾아푸는 문제다. 다음과 같은 규칙이 나온다. 시작과 끝은 무조건 1로 고정이 된다. 나머지 부분은 직전 수에서 1을 증가시키거나 1을 감소시키거나 그대로 사용한다는 규칙이다. 그렇게 되면 피라미드 형식으로 가운데에서 대칭이 된다.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n; //키 차이
int a, b; //원숭이 키, 개 키
cin >> a >> b;
n = b - a; //키차이
/*
1 (1)
1 1 (2)
1 2 1 (3 4)
1 2 2 1 (5 6)
1 2 3 2 1 (7 9)
1 2 3 3 2 1 (10 12)
1 2 3 4 3 2 1 (13 16)
1 2 3 4 4 3 2 1 (17 20)
*/
if (n == 0) { //키가 같은 경우
cout << 0;
}
else if (n == 1 || n == 2) { //키 차이가 1인 경우
cout << 1;
}
else {
unsigned long long int start = 3; //시작일
unsigned long long int end = 4; //끝일
unsigned long long int len = 1; //수의 범위 길이
unsigned long long int loop = 0; //루프가 돈 횟수
unsigned long long int cnt = 3; //키를 늘리는 일수
while (true) {
if (start <= n && n <= end) { //찾는 수의 범위에 들어 있는 경우
break; //탈출
}
else {
if (loop % 2 == 1) { //직전 루프가 홀수번째 실행한 루프이면
len++; //수가 들어있을 수 있는 범위를 증가
}
start = end + 1; //시작은 직전 범위에서 1을 더한 값
end = start + len; //끝은 다음 시작에서 수가 들어있을 수 있는 범위를 더한 것
}
loop++; //루프가 돈 횟수를 증가
cnt++; //키를 늘리는 일수를 증가
}
cout << cnt;
}
}
'백준' 카테고리의 다른 글
백준9372 - 상근이의 여행 (0) | 2020.01.09 |
---|---|
백준9019 - DSLR (0) | 2020.01.05 |
백준1309 - 동물원 (0) | 2019.12.27 |
백준1544 - 사이클 단어 (0) | 2019.12.26 |
백준1965 - 상자넣기 (0) | 2019.12.26 |