본문 바로가기
백준/C++

백준 1654번 : 랜선 자르기 [C++]

by 대니스 2022. 8. 22.

주소 : https://www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

소스 코드 :

#define _SRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	ios_base::sync_with_stdio(0);cin.tie(0);
	int K, N;
    int result = 0;
	vector<long long int> v;
	cin >> K >> N;
	for (int i = 0;i < K;i++)
	{
		long long int element;
		cin >> element;
		v.push_back(element);
	}
    sort(v.begin(), v.end());
    long long int start = 1;
    long long int end = v[K-1];
    long long int mid;

    while (start <= end)
    {
        long long int sum = 0;
        mid = (start + end) / 2;

        for (int i = 0;i < K;i++)
        {
            sum += v[i] / mid;
        }

        if (sum >= N)
        {
            start = mid + 1;
            if (result < mid)
                result = mid;
        }

        else if (sum < N)
            end = mid - 1;
    }
	cout << result;
}

마무리 : 입력값이 매우 크기 때문에 자료형을 long long int로 하였다. 그리고 최대한 많은 랜선을 구하기 위해서는 입력된 랜선값 내에서 구해야하기 때문에 이진 탐색으로 나누어서 최댓값을 구하면 된다.

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

백준 2805번 : 나무 자르기 [C++]  (0) 2022.08.23
백준 1874번 : 스택 수열 [C++]  (0) 2022.08.23
백준 2108번 : 통계학 [C++]  (0) 2022.08.22
백준 1966번 : 프린터 큐 [C++]  (0) 2022.08.22
백준 1929번 : 소수 구하기 [C++]  (0) 2022.08.18