백준/이분탐색

[백준 14627번 / C++] 파닭파닭

배발자 2022. 1. 25.
반응형

1. 범위가 "1<= L <=1,000,000,000" 라면 이진탐색을 의심하자. 이진탐색으로 구현. 

2. 각 파의 길이 값을 벡터에 저장. 

3. 공통된 길이의 파를 구할 때까지 이진탐색

  • 각 파의 길이 값을 갖고 있는 벡터의 원소마다 이진 탐색으로 얻게된 mid값을 나누어서 얻는 몫의 합이 C와 같아야한다. 
  • 최댓값을 구할땐 low값을 변경하는 조건문에서 mid값 저장해놓기 (최솟값일 땐 high 조건문)  

 

4. 나머지 계산 

#include <iostream>
#include <vector>
using namespace std; 
int a, b;
vector <int> v;
typedef long long ll; 
bool check(ll mid) {
	ll cnt = 0; 
	for (int i = 0; i < v.size(); i++) {
		cnt += v[i] / mid; 
	}
	return cnt >= b; 
}
int main() {
	cin >> a >> b; 
	v.resize(a, 0); 
	ll sum = 0; 
	for (int i = 0; i < a; i++) {
		cin >> v[i]; sum += v[i]; 
	}
	ll l = 1; 
	ll h = 1000000000; 
	ll result = 0; 
	while (l <= h) {
		ll mid = (l + h) / 2; 
	    //최대를 묻는 문제 
		if (check(mid)) {			
			l = mid + 1;
			result = mid; 
		}
		else {
			h = mid - 1;
		}
	}
	ll ans = sum-result*b; 
	cout << ans; 
}
 

14627번: 파닭파닭

첫째 줄에 승균이가 시장에서 사 온 파의 개수 S(1≤S≤1,000,000), 그리고 주문받은 파닭의 수 C(1≤C≤1,000,000)가 입력된다. 파의 개수는 항상 파닭의 수를 넘지 않는다. (S≤C) 그 후, S 줄에 걸쳐 파

www.acmicpc.net

반응형

'백준 > 이분탐색' 카테고리의 다른 글

[백준 1072번 / C++] 게임  (0) 2022.01.26
[백준 2776번 / C++] 암기왕  (0) 2022.01.26
[백준 1561번 / C++] 놀이 공원  (0) 2022.01.19
[백준 6236번 / C++] 용돈 관리  (0) 2022.01.17
[백준 2343번 / C++] 기타 레슨  (0) 2022.01.17

댓글