알고리즘
백준 1057번 토너먼트(시뮬레이션)
심재철
2017. 8. 25. 22:52
게임 대진표 에서 보던걸 그대로 문제로 옮긴듯
스타 리그로 예를 들면 이영호와 김택용이 각각 다른조에 있는데 몇번만에 둘이 만나서 대결하느냐를 구하는 시뮬레이션 문제
물론 처음부터 같은 조에 있으면 1을 출력할것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> #include <algorithm> #include <memory.h> using namespace std; int n; int main() { cin >>n; int a,b; cin>>a>>b; int count=1; while((int)((double)a/2+0.5) != (int)((double)b/2+0.5) ) //반으로 나눈걸 반올림한게 같은 경우 대결함. { a = a%2==0? a/2:a/2+1; b = b%2==0? b/2:b/2+1; count++; } cout<<count<<endl; return 0; } | cs |
while문 조건은 각각 조를 반으로 나눠서 반올림 한것을 표현한것이다.
c와 c++에서는 반올림을 저런식으로 표현한다고 한다.
1.5~2.0사이의 수에 0.5를 더하게 되면 2.0~2.5가 되는데 여기서 버림( == int로 형변환하는것과 동치)을 해버리면
2가 나온다 즉 1.5~2.0 사이의 숫자를 반올림 한것과 같은 효과
마찬가지로 1.0~1.5미만의 수는 1.5~2.0미만의 수가 될것이고 버림을 할경우 1로 되기때문에 반올림이 된다. 그리고 나서 a 와 b 가 계속 이긴다고 가정했으므로 조 숫자를 반으로 나눠주기만 하면됨
그것만 알면 어렵지 않은 문제