이분법 최대 치 최소 화 문제 해결

질문 설명:
n 개의 정 수 를 포함 하 는 서열 을 m 개의 연속 적 인 하위 서열 로 나누다.i 번 째 서열 의 각 수의 합 을 S (i) 로 설정 하고 모든 S (i) 의 최대 치 를 구 하 는 것 이 가장 작은 것 은 얼마 입 니까?
예 를 들 어 서열 1, 2, 3, 5, 4 를 3 개의 서열 로 나 누 는 가장 좋 은 방안 은 1, 2, 3 | 25 이다. 그 중에서 S (1), S (2), S (3) 는 각각 6, 7, 4 이 고 최대 치 는 7 이다.
12 | 32 | 54 로 나 누 면 최대 치 는 9 로 가장 작은 것 이 아니다.
알고리즘 사고
최대 치 를 최소 화 하 는 문 제 를 해결 하려 면 기본 적 인 사 고 는 임의의 범위 (배열 의 최대 치 를 배열 의 모든 요소 의 합 으로 입력 하 는 것) 를 선택 한 다음 에 이 범위 에서 이분법 을 하고 매번 범위 의 중간 치 mid 를 최소 치 로 한 다음 에 mid 값 에서 배열 이 m 부분 으로 나 눌 수 있 는 지 판단 하 는 것 이다.
코드 는 다음 과 같 습 니 다:
#include <stdio.h>
int n,m;
bool judge(const int *a,int key)
{
     int sum=0;
     int count=0;
     for(int i=0;i<n;i++)
     {
             sum += a[i];
             if(sum>key)
             {
               sum=a[i];
               count++;         
             }
     }
     if((count+1)<=m)
        return 1;
     return 0;
}

void  binary(const int *a,int left,int right)
{

   while(left<right)
   {
     int mid=(left+right)/2;;/// left+((right-left)>>1)

     if(judge(a,mid))
     {
        right = mid;                
     }
     else
     {
        left = mid+1;
     }
   }
    printf("%d
"
,left); // ,right %d } int main() { int t; int a[505]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); int left=0; int right=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); right += a[i]; if(a[i]>left) { left = a[i]; } } binary(a,left,right); } return 0; }

좋은 웹페이지 즐겨찾기