U E D R , A S I H C RSS

금고/하기웅

잡담

오호 역시 쉬운 문제가 아니었군~
대충� 나온다만... 사�트가서 보니 삼분법� 빠르니.. �분법� 최��란걸 �명� 못한다�니 그러네..ㅋㅋ
빡신 문제구만..^^ �중 다�내믹��나 ��나...ㅜㅜ; � 조합론� 쓰면 �가 빠르니..ㅋㅋ 머리 아�..ㅋㅋ

지금보니 ��할게 많네..ㅡㅡ; 금고를 떨어뜨렸� 때 깨진 경우 안깨진 경우� 따�서 다�� 할 수 있는 작업� 틀려지고..
�거 지대 복잡하네..ㅡㅡ;
오늘 하루 종� 삽질�여...ㅡㅡ;

소�

너무 쉽게 나오는� 잘못한 건가~??
�단 f층�서 s개� 금고가 있으면 s-1개는 f층� 반, � 그기� 반 �렇게 떨어뜨려보면 �고
마지막 한개는 그렇게 해서 �혀진 공간�서 제� 낮�� 부터 하나하나 떨어뜨려보면 �다고 ��했는�.
그래서 나온 �� floor/2^(s-1)+s-1임~

그리고 혹시나 floor/2^s� 1보다 작아 질때는 s번� 떨어뜨려 볼 필요가 없기때문�
s를 �소 시켜가며 floor/2^s가 1보다 커거나 같아질때 s+1� 리턴하면 �다.

s(금고)가 충분하다고 했� 경우를 ��해보면...
7�때, 7��고 하면 4�서 한번 6�서 한번 7�서 한번�면 3번� 찾아지는�.
8�때, 8��고 하면 4�서 한번 6�서 한번 7�서 한번 8�서 한번 4번� 찾아진다.
2� 지수승�서 부터 하나가 많아진다.
8� 2^3�고 지수� 1� �한 4번� 최소횟수가 �다.
9�때 9�고하면 그때� 4회가 �다 (16� �때 까지)

즉, floor/2^s가 1보다 커지는 순간 s+1회 임� 알 수 있다.

소스

~cpp
#include <iostream> 
#include <cmath> 
using namespace std; 

int testcase, nFloor, nSaver; 

int calculate(int f, int s) 
{ 
	if(f/pow(2,s)<1)
	{
		while(s--)
		{
			if(f/pow(2,s)>=1)
				return s+1;
		}
	}
    return f/pow(2,s-1)+s-1;   // f/pow(2,s-1) =>s-1번� 통해 나뉘어지고 난 후� 그 부분� 최소횟수
} 

int main() 
{ 
    cin>>testcase; 
    while(testcase--) 
    { 
        cin>>nFloor>>nSaver; 
        cout << calculate(nFloor, nSaver) <<endl; 
    } 
    return 0; 
} 
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:46
Processing time 0.0513 sec