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 <iostream>
#include <vector>

using namespace std;

int m, n;
vector<int> w;

bool IsStorable( int width ) {

    int row = 0, c = 0, i = 0;

    while ( i < n ) {
	if ( c + w[i] <= width ) {
	    c += w[i];
	    ++i;
	}
	else if ( ++row < m ) c = 0;
	else return false;
    }

    return true;
}

int main() {

    while ( cin >> m >> n && m && n ) {

	w.resize( n );
	for ( int i=0; i<n; ++i ) cin >> w[i];

	int minw = 1;
	int maxw = 1500000;
	if ( !IsStorable( maxw ) ) cout << "NA" << endl;

	while ( maxw > minw ) {
	    int mid = (maxw + minw)/2;
	    if ( IsStorable(mid) ) maxw = mid;
	    else                   minw = mid + 1;
	}

	cout << minw << endl;
    }
    
    return 0;
}

C++: #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <functional>
#include <numeric>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#include <sstream>
#include <complex>

using namespace std;

#define FOR(i,a,b) for(long long i=(a);i<(b);i++)
#define REP(i,N) for(long long i=0;i<(N);i++)
#define ALL(s) (s).begin(),(s).end()
#define fi first
#define se second

#define PI acos(-1.0)
#define INF 1000000007
#define EPS 1e-10
#define MAX_N 20000
#define MAX_M 16

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<double, double> PD;
typedef pair<string, ll> PS;
typedef vector<ll> V;
typedef pair<P, char> PC;

ll  n, m, b[1000];

int main(){
	while (cin >> m >> n&&n + m){
		ll MAX = -1;
		REP(i, n){
			cin >> b[i];
			MAX = max(MAX, b[i]);
		}
		ll lb = MAX - 1, ub = 1500001;
		while (ub - lb > 1){
			int co = 1;
			ll mid = (lb + ub) / 2;
			ll sum = 0;
			REP(i, n){
				sum += b[i];
				if (sum > mid){
					sum = b[i];
					co++;
				}
			}
			if (co <= m)ub = mid;
			else lb = mid;
		}
		cout << ub << endl;
	}
}

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

#define UP_LIMIT 1
#define DOWN_LIMIT 2

using namespace std;

int solve(int limit, const vector<int> &book){
  int ret;
  int pre_w = -1;
  int l = 0;
  int r = 4000000;

  ret = r;
  while(true){
    int st = -1;
    int w = (r+l)/2;
    int maxsw = 0;
    int sw = 0;
    int stair = 0;

    if( w == pre_w )break;

    for(int i = 0; i < book.size(); ++i){
      maxsw = max( maxsw, sw );
      if( sw + book[i] <= w ){
	sw += book[i];
      }else if( stair < limit ){
	sw = book[i];
	stair++;
      }else{
	st = UP_LIMIT;
      }
    }

    //cout << "R,L : " << r << ' ' << l << "STAIR : " << stair << " MAXSW : " << maxsw << endl;

    if( st == UP_LIMIT || stair >= limit ){
      l = w;
    }else if( st == -1 ){
      ret = min( ret, maxsw );
      r = w;
    }
    
    pre_w = w;
  }
  return ret;
}

int main(){
  while(true){
    int m,n;
    vector<int> books;

    cin >> m >> n;
    if(m==0&&n==0)break;
    for(int i = 0; i < n; ++i){
      int t;
      cin >> t;
      books.push_back(t);
    }

    cout << solve( m, books ) << endl;

  }
  return 0;
}

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=1500001;
		
		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(right-left<0.0001){
				printf("%d\n",(int)right);
				break;
			}
		}
	}
}

C++: #include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>

#define rep(i,x) for(i=0;i<x;i++)
#define rrep(i,x) for(i=x-1;i>=0;i--)
#define rep_to(a,i,x) for(i=a;i<x;i++)
#define si_1(x) scanf("%d",&x)
#define si_2(x,y) scanf("%d %d",&x,&y)
#define debug(x) printf("x:%d\n",x)

int main()
{
	int i=0,j=0,n,m;
	int mark,num[114]={};
	int min=0,max=0,len=0;
	int flag=0;

	while(si_2(m,n)!=EOF)
	{
		i=0;
		j=0;
		min=0;
		max=0;
		len=0;
		flag=0;

		if(n==0 && m==0)break;
		rep(i,n)
		{
			si_1(num[i]);
			max+=num[i];
		}
		while(min<=max)
		{
			mark=(min+max)/2;
			flag=0;
			i=0;
			j=0;
			while(1)
			{
				++i;
				len=0;
				for(;j<n;j++)
				{
					if(mark<=len+num[j])
					{
						break;
					}
					else len+=num[j];
				}
				if(i<=m && j==n)//?¶?????????¬?????\??£??????
				{				
					flag=1;
					break;
				}
				else if(i>m)//??\?????????????????£??????
				{
					flag=0;
					break;
				}
			}
			if(flag==0)min=mark+1;
			else if(flag==1)max=mark-1;
		}
		printf("%d\n",(min+max)/2);
	}
	return 0;
}

C++: #include<cstdio>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
	int a[100],N,M,i,j,k,s,h;
	while(scanf("%d%d",&M,&N),N)
	{
		vector<int>v;
		for(i=0;i<N;++i)scanf("%d",&a[i]);
		for(i=0;i<N;++i)
			for(j=0;j+i<N;v.push_back(s),++j)
				for(s=k=0;k<=i;++k)
					s+=a[j+k];
		sort(v.begin(),v.end(),greater<int>());
		v.erase(unique(v.begin(),v.end()),v.end());
		s=*max_element(a,a+N);
		for(i=v.size()-1;;--i)if(v[i]>=s)break;
		v.erase(v.begin()+i+1,v.end());
		for(i=v.size()-1;;--i)
		{
			for(h=s=j=0;j<N;++j)
			{
				if(s+a[j]>v[i])
				{
					s=a[j];++h;
					if(h>=M)goto E;
				}
				else s+=a[j];
			}
			printf("%d\n",v[i]);
			goto N;
E:;
		}
N:;
	}
	return 0;
}