잡담 ¶
오호 ì—시 쉬운 ë¬¸ì œê°€ 아니었군~
대충ì�€ 나온다만... 사ì�´íŠ¸ê°€ì„œ 보니 삼분법ì�´ ë¹ ë¥´ë‹ˆ.. ì�´ë¶„법ì�´ 최ì �ì�´ëž€ê±¸ ì¦�명ì�„ 못한다ëŠ�니 그러네..ã…‹ã…‹
ë¹¡ì‹ ë¬¸ì œêµ¬ë§Œ..^^ ì�´ì¤‘ 다ì�´ë‚´ë¯¹ì�´ë�¼ë‚˜ ë�ë�¼ë‚˜...ㅜㅜ; ë� ì¡°í•©ë¡ ì�„ ì“°ë©´ ë�ê°€ ë¹ ë¥´ë‹ˆ..ã…‹ã…‹ 머리 ì•„í�¼..ã…‹ã…‹
지금보니 ìƒ�ê°�í• ê²Œ 많네..ã…¡ã…¡; ê¸ˆê³ ë¥¼ ë–¨ì–´ëœ¨ë ¸ì�„ 때 깨진 경우 안깨진 경우ì—� ë”°ë�¼ì„œ 다ì�Œì—� í• ìˆ˜ 있는 작업ì�´ í‹€ë ¤ì§€ê³ ..
�거 지대 복잡하네..ㅡㅡ;
오늘 하루 종� 삽질�여...ㅡㅡ;
대충ì�€ 나온다만... 사ì�´íŠ¸ê°€ì„œ 보니 삼분법ì�´ ë¹ ë¥´ë‹ˆ.. ì�´ë¶„법ì�´ 최ì �ì�´ëž€ê±¸ ì¦�명ì�„ 못한다ëŠ�니 그러네..ã…‹ã…‹
ë¹¡ì‹ ë¬¸ì œêµ¬ë§Œ..^^ ì�´ì¤‘ 다ì�´ë‚´ë¯¹ì�´ë�¼ë‚˜ ë�ë�¼ë‚˜...ㅜㅜ; ë� ì¡°í•©ë¡ ì�„ ì“°ë©´ ë�ê°€ ë¹ ë¥´ë‹ˆ..ã…‹ã…‹ 머리 ì•„í�¼..ã…‹ã…‹
�거 지대 복잡하네..ㅡㅡ;
오늘 하루 종� 삽질�여...ㅡㅡ;
소ê°� ¶
너무 쉽게 나오는� 잘못한 건가~??
ì�¼ë‹¨ 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회 임� 알 수 있다.
ì�¼ë‹¨ f층ì—�서 sê°œì�˜ ê¸ˆê³ ê°€ 있으면 s-1개는 f층ì�˜ ë°˜, ë˜� 그기ì�˜ ë°˜ ì�´ë ‡ê²Œ ë–¨ì–´ëœ¨ë ¤ë³´ë©´ ë�˜ê³
마지막 한개는 ê·¸ë ‡ê²Œ 해서 ì¢�혀진 공간ì—�서 ì œì�¼ ë‚®ì�€ë�° 부터 하나하나 ë–¨ì–´ëœ¨ë ¤ë³´ë©´ ë�œë‹¤ê³ ìƒ�ê°�했는ë�°.
그래서 나온 �� floor/2^(s-1)+s-1임~
s를 �소 시켜가며 floor/2^s가 1보다 커거나 같아질때 s+1� 리턴하면 �다.
7ì�¼ë•Œ, 7ì�´ë�¼ê³ 하면 4ì—�서 한번 6ì—�서 한번 7ì—�서 한번ì�´ë©´ 3번ì—� 찾아지는ë�°.
8ì�¼ë•Œ, 8ì�´ë�¼ê³ 하면 4ì—�서 한번 6ì—�서 한번 7ì—�서 한번 8ì—�서 한번 4번ì—� 찾아진다.
2� 지수승�서 부터 하나가 많아진다.
8ì�€ 2^3ì�´ê³ 지수ì—� 1ì�„ ë�”한 4번ì�´ 최소횟수가 ë�œë‹¤.
9ì�¼ë•Œ 9ë�¼ê³ 하면 그때ë�„ 4회가 ë�œë‹¤ (16ì�´ ë� 때 까지)
소스 ¶
~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;
}










