Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(20929) 중간 본문

백준 (C++)/Solve

(20929) 중간

dh-winternagi 2026. 4. 23. 00:11

https://www.acmicpc.net/problem/20929

단계별로 풀어보기

41단계(인터랙티브와 투 스텝 1) 10번째

 

 

 

A와 B의 x(=n/2)번째 수가 a, b라고 하자. a<b라고 하면 A의 x번째 수보다 크거나 같은 수가 a에 n-x개, b에 n-x+1개로 총 n+1개 있다. 따라서 A의 1~x번째 수는 중간값보다 작거나 같다. 같은 방식으로 생각하면 B의 x+1~n번째 수는 중간값보다 크거나 같다.

따라서 A와 B의 1~n번째 수들 중 중간값은 A의 x+1~n번째 수와 B의 1~x번째수들 중 중간값을 구하는 것과 같다. a>b면 반대로 하면 된다.

범위가 절반으로 줄어들었으므로 이분 탐색으로 계속해서 범위를 줄여나가면 된다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  
  int n;
  
  cin >> n;
  
  if(n==1){
    int a, b;
    cout << "? A 1" << endl;
    cin >> a;
    cout << "? B 1" << endl;
    cin >> b;
    
    cout << "! " << (a<b ? a : b);
    
    return 0;
  }
  
  int ar=1, al=n, br=1, bl=n, amid, bmid, aresp, bresp;
  
  while(true){
    amid= (ar+al)/2;
    bmid= (br+bl)/2;
    
    cout << "? A " << amid << endl;
    cin >> aresp;
    cout << "? B " << bmid << endl;
    cin >> bresp;
    
    if(ar==al) break;
    
    if(aresp<bresp){
      ar= amid+1;
      bl= bmid;
    }else{
      al= amid;
      br= bmid+1;
    }
  }
  
  cout << "! " << (aresp<bresp ? aresp : bresp);
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(10775) 공항  (0) 2026.04.23
(13975) 파일 합치기 3  (0) 2026.04.23
(23435) Cloud computing  (0) 2026.04.23
(25672) Even and Odd Combinations  (0) 2026.04.22
(27312) 운영진에게 설정 짜기는 어려워  (0) 2026.04.22