Go: package main

import (
	"bufio"
	"os"
	"strings"
	"strconv"
	"fmt"
	)

var scanner = bufio.NewScanner(os.Stdin)
const MAX_WIDTH = 1500000

func main() {
	// 二分探索で探す
	// 二分探索はソート済みの配列に対して、特定の条件を満たす値を
	// 効率よく選択するアルゴリズム
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		m, _ := strconv.Atoi(buf[0])
		n, _ := strconv.Atoi(buf[1])
		if n == 0 && m == 0 {
			break
		}
		books := make([]int, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			books[i], _ = strconv.Atoi(scanner.Text())
		}
		check := func(width int) bool {
			// widthの幅の本棚に順番にbooksを詰めて行ったら
			// 何段になるのかを確認し、それがmを以下であることを確認する
			shelf_index := 1
			position_in_stage := 0
			for i := 0; i < n; i++ {
				// 入れることができない本がある時点でこのwidthは不採用
				if books[i] > width {
					return false
				}
				// 新たに本を追加することができるかをチェックする
				if position_in_stage + books[i] <= width {
					// 新たに本を入れることができたので、そのステージにおける
					// 現在の本の位置を記録
					position_in_stage += books[i]
				} else {
					// 新たな本を入れることができなかったので、一段下のステージに
					// 入れれば良い
					position_in_stage = books[i]
					shelf_index++ // 本棚のステージ数が増えた
				}
			}
			return shelf_index <= m // 条件を満たすかの確認
		}
		low, high := 0, MAX_WIDTH
		for low < high {
			mid := (low+high)/2
			if check(mid) {
				high = mid
			} else {
				low = mid+1
			}
			// log.Printf("low: %d, high: %d\n", low, high)
		}
		fmt.Println(low)
	}
}

C++: #include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<queue>

using namespace std;

#define rep(i,n) for(int i=0;i<int(n);i++)
#define reps(i,n) for(int i=1;i<=int(n);i++)

#define f first
#define s second

int main(){
	while(1){
		int n,m;
		cin>>n>>m;
		if(n==0)break;
		
		int hon[111];
		rep(i,m){
			cin>>hon[i];
		}
		
		double left=0;
		double right=1000001;
		
		while(1){
			double h=(left+right)/2;
			
			int dan=0;
			int now=0;
			rep(i,m){
				if(now+hon[i]>h){
					now=0;
					i--;
					dan++;
				}else{
					now+=hon[i];
				}
				if(dan>n)break;
			}
			
			if(dan>n){
				left=h;
			}else{
				right=h;
			}
			
			if((int)(left+0.49) == (int)right){
				printf("%d\n",(int)right);
				break;
			}
		}
	}
}

C++: #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    while(1){
        int m,n,book[101]={0};
        int nowans,nowmin=0,nowmax=1500001;
        scanf("%d %d",&m,&n);
        if(m==0&&n==0)
            break;
        for(int i=0;i<n;i++)
            scanf("%d",&book[i]);
        for(int i=0;i<100;i++){
            int po=0;
            int dan[21]={0};
            nowans=(nowmin+nowmax)/2;
            for(int j=0;j<n+1;j++){
                if(j==n){
                    nowmax=nowans;
                    break;
                }
                if(dan[po]+book[j]<=nowans){
                    dan[po]+=book[j];
                    continue;
                }
                else if(book[j]>nowans){
                    nowmin=nowans;
                    break;
                }
                else if(dan[po]+book[j]>nowans){
                    po++;
                    if(po==m){
                        nowmin=nowans;
                        break;
                    }
                    dan[po]+=book[j];
                }
            }
        }
        printf("%d\n",nowans+1);
    }
}

C++: #include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int cum[102];

bool solve(int h){
  int f=0;
  for(int i=0;i<m;i++){
    int j;
    for(j=f+1;j<=n;j++){
      if(h<cum[j]-cum[f]){
	j--;
	break;
      }
    }
    f=j;
  }
  if(f>=n) return true;
  return false;
}

int main(void){

  while(1){

    scanf("%d %d",&m,&n);
    if(!n && !m) break;

    for(int i=1;i<=n;i++){
      scanf("%d",&cum[i]);
      cum[i]+=cum[i-1];
      //printf("%d ",cum[i]);
    }
    //puts("");
    int ans=1500000;
    int s=0,h,e=1500000;
    while(s<=e){
      h=(s+e)/2;

      if( solve(h) ){
	//puts("a");
	ans=min(h,ans);
	e=h-1;
      } else {
	s=h+1;
      }

    }
    printf("%d\n",ans);
  }
}

C++: #include<iostream>
using namespace std;

int m,n;
int books[110];
int solves();
int search(int a);

int main(){
	while(1){
		cin >> m >> n;
		if(m == 0 && n == 0) break;
		for(int i=0;i<n;i++){
			cin >> books[i];
		}
		int ans = solves();
		cout << ans << endl;
	}
}

int solves(){
	int ub = 0,lb = 2000000, mid;
	for(int i=0;i<1000;i++){
		mid = (ub + lb) / 2;
		if(search(mid)) lb = mid;
		else ub = mid;
	}
	return lb;
}

int search(int a){
	int len = a;
	int cou = 0;
	for(int i=0;i<n;i++){
		while(1){
			if(0 > len-books[i]){
				cou++;
				len = a;
			}
			else break;
			if(cou == m) return 0;
		}
		len -= books[i];
	}
	return 1;
}

C++: #include<bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;
int n,m,a[101],y;
bool nibun(int x){
	int s=0,q=0;
	r(i,n){
		if(s+a[i]<=x)s+=a[i];
		else s=a[i],q++;
	}
	return m>=q+1;
}
main(){
	while(cin>>m>>n,m){
	  y=1e9;
	  r(i,n)cin>>a[i],y=min(y,a[i]);
	  int l=y,r=1500001;
	  while(l<r){
    	int mid=(l+r)/2;
		if(nibun(mid))r=mid;
		else l=mid+1;
	  }
	  cout<<l<<endl;
    }
}

C++: #include <iostream>
#include <vector>

using namespace std;
int main()
{
    while(true){
        int m, i;
        int low = 1, high = 1500000, mid;
        int N = 0;
        cin >> m;
        cin >> i;
        
        if( i == 0 )
            break;
        
        vector<int> a(i);
        
        for(int j = 0 ; j < i ; j++)
            cin >> a[j];
        
        while(true){
            mid = ( low + high ) / 2;
            int l = 0;
            bool que = false;
            
            for(int k = 0 ; k < m ; k++){
                int tot = 0;
                
                while(true){
                    if( mid >= tot + a[l] ){
                        tot = tot + a[l];
                        if( l< i - 1 )
                            l++;
                        else{
                            que = true;
                            break;
                        }
                    }
                    else
                        break;
                }
                
                if( que == true )
                    break;
            }
            
            if( que == true )
                high = mid;
            else
                low = mid + 1;
            
            if( low == high ){
                N = low;
                break;
            }
        }
        
        cout << N <<endl;
    }
}

C++: #include <iostream>
#include<cstdio>
#include <cstring>	// require memset
#include <fstream>	// require freopen

using namespace std;

int m, n;	// {IÌi 1  m  20, {Ìª 1  n  100
int w[100];

bool calc_m (int curr_w )
{
	int cm = 0;
	int j = 0;
	while (j < n ){
		int cw = 0;
		while (cw + w[j] <= curr_w && j < n ){
			cw += w[j];
			j++;
		} // end while
		cm++;
	} // end if

	return (cm <= m );
}

int main()
{
//	cut here before submit 
//	freopen ("testcase.persistence", "r", stdin );

	const int MaxW = 1500000;

	for (;; ){// {IÌ ans  1500000
		scanf ("%d%d", &m, &n ); if (!m ) break;
		memset (w, 0, sizeof (w ) );

		for (int i = 0; i < n; i++ ){
			scanf ("%d", w+i );
		} // end for
		int l = w[0];
		int r = MaxW;
		int mid = 0;
		while (l <= r ){
			mid = (l+r)/2;
			if (calc_m (mid ) ){
				r = mid-1;		
			}else{
				l = mid+1;
			} // end if
		} // end while
		cout << mid << endl;
	} // end loop
		
	return 0;
}