본문 바로가기
이론/코딩테스트

[백준] 1654번 랜선자르기 (이분탐색)

by 퇴근후개발 2022. 7. 31.
반응형

-문제

틀렸습니다 나왔던 이유 : 자료형 실수

1 <= 랜선의 길이<= 2^31 - 1 이고, 랜선길이 두개로 mid(H)값을 계산하기 때문에  

int  lt, rt, H; -> long long lt, rt, H; 

으로 수정하여 통과했다. 

 

-코드

#include<stdio.h>
#include<vector>
using namespace std;

vector<int> a;
int n;
bool cal(int h)
{
	long long  cnt = 0;
	for (int i = 0; i < a.size(); i++)
	{
		cnt += a[i] / h;
	}
	if (cnt >= n) return true;
	else return false;
}

int main()
{
	int k, tmp, max=0;
	scanf("%d %d", &k, &n);
	for (int i = 0; i < k; i++)
	{
		scanf("%d", &tmp);
		a.push_back(tmp);
		if (max < a[i]) max = a[i];
	}

	int res=0;
	long long lt, rt, H;
	lt = 0;
	rt = max;

	while (lt<=rt)
	{
		H = (lt + rt) / 2;
		if (H == 0)
		{
			res = rt;
			break;
		}
		if (cal(H))
		{
			res = H;
			lt = H + 1;
		}
		else
		{
			rt = H - 1;
		}
	}
	printf("%d", res);

	return 0;
}
반응형