https://www.acmicpc.net/problem/1094
알고리즘을 말로 설명해주고 있어 알고리즘을 짜는 것은 어렵지 않다.
64,32,16,8,4,2,1 중 하나 씩 더해서 64 이하의 수들을 표현할 수 있다.
예를들어 23은 16,4,2,1 을 더해서 얻을 수 있다.
위 수들은 2를 0~6번거듭제곱해서 얻을 수 있다는 점을 이용해
len[7]을 선언하고 len[6]에 1을 할당해주면 초기 상태를 만들 수 있다.
len[6]=1은 2^6이 하나 있다는 뜻이다.
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include<stdio.h> #define NUM 7 int customPow(int n) { int result = 1; for (int i = 1; i <= n;i++) { result *= 2; } return result; } int main() { int len[NUM] = {0}; int minIndex; int X; int sum = 64; int cnt = 0; len[6] = 1; scanf("%d",&X); while (sum!=X) { sum = 0; for (int i = 0; i < NUM;i++) { if (len[i] > 0) { minIndex = i; break; } } if (minIndex>0) { len[minIndex]--; minIndex--; len[minIndex] += 2; } for (int i = minIndex; i < NUM;i++) { if (len[i] > 0) { sum += customPow(i); } } if (sum>=X) { len[minIndex]--; } } for (int i = 0; i < NUM;i++) { cnt += len[i]; } printf("%d\n",cnt); return 0; } | cs |
'백준' 카테고리의 다른 글
9324)진짜 메세지 (0) | 2019.02.09 |
---|---|
1057)토너먼트 (0) | 2019.02.08 |
1748)수 이어 쓰기 1 (0) | 2019.02.07 |
5212)지구 온난화 (0) | 2019.02.07 |
2810)컵홀더 (0) | 2019.02.06 |