지금 현재
2 5
9 10
데이터를 넣으면
답이 5가 출력되고 있습니다.
일단 이진탐색에서 while문 끝나고 난 다음의 코드가 총체적 난국이니 이부분부터 빠르게 고칩시다.
그리고 문제조건에 의하면 sum값이 int범위를 넘어가도록 들어올 수도 있기 때문에
변수 타입을 long long으로 바꾸셔야 합니다...
2805번 - 나무 자르기
#include <iostream>
#include <algorithm>
#define Max 1000003
using namespace std;
int arr[Max],n,m;
int binary(int front, int goal, int temp)
{
int start = front, end = goal, mid;
long long int sum=0;
while (start <= end)
{
mid = (start + end)/ 2;
for (int i = 0; i < n; i++)
{
if (arr[i] - mid>0)
sum += (arr[i] - mid);
}
if (temp == sum)
return mid;
else if (temp < sum)
{
start = mid+1 ;
sum = 0;
}
else
{
end = mid - 1;
sum = 0;
}
}
for (int i = mid-1; i > 0; i--)
{
for (int j = 0; j < n; j++)
{
if (arr[j] - i>0)
sum += (arr[j] -i);
}
if (temp <= sum)
return i;
sum=0;
}
}
int main()
{
int ma=0,mi=200000001;
cin >>n>>m;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
if (ma < arr[i])
ma = arr[i];
if (mi>arr[i])
mi = arr[i];
}
//정렬
sort(arr, arr + n);
//이진탐색 실시
cout<<binary(mi,ma,m)<<endl;
}
댓글을 작성하려면 로그인해야 합니다.
scared22 9년 전
제가 모든 부분에 케이스에 대해서 적용을 해보진 못했지만 왠만한 경우는 다된다고 생각을 합니다.
어떤 경우에서 이답이 오답이 나오는지 모르겠습니다.
ㅜㅜ 이문제에서 벗어나고 싶습니다. 도와주세요 ㅜㅜ