## Editorial for Phân Trang

Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

#### Code mẫu của flashmt

var f,a:array[0..6000] of longint;
n,l,i,j:longint;

function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;

function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=y;
end;

begin
read(n,l);
for i:=1 to n do
begin
read(j);
a[i]:=a[i-1]+j;
f[i]:=l;
end;
for i:=1 to n do
for j:=i-1 downto 0 do
if a[i]-a[j]<=l then
f[i]:=min(f[i],max(f[j],l-a[i]+a[j]))
else break;
writeln(f[n]);
end.


#### Code mẫu của happyboy99x

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
typedef vector<int> vi;
typedef vector<vi> vvi;

#define sz(a) int((a).size())
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(c) (c).begin(), (c).end()
#define tr(c,i) for(typeof((c).begin()) i = (c).begin(), _e = (c).end(); i != _e; ++i)
#define present(c,x) ((c).find(x) != (c).end())
#define cpresent(c,x) (find(all(c),x) != (c).end())
#define rep(i,n) for(int i = 0, _n = (n); i < _n; ++i)
#define repd(i,n) for(int i = (n)-1; i >= 0; --i )
#define fo(i,a,b) for(int i = (a), _b = (b); i <= _b; ++i)
#define fod(i,a,b) for(int i = (a), _b = (b); i >= _b; --i)

#define INF 1000000000
#define N 6005

int w[N], l, n, f[N];

int main() {
//freopen( "input.txt", "r", stdin );
//freopen( "output.txt", "w", stdout );
scanf("%d%d",&n,&l);
fo(i,1,n) { scanf("%d",w+i); w[i] += w[i-1]; }
fo(i,1,n) {
f[i] = INF;
repd(j,i) {
if( w[i] - w[j] > l ) break;
f[i] = min( f[i], max( f[j], l-(w[i]-w[j]) ) );
}
}
printf("%d\n", f[n]);
return 0;
}


#### Code mẫu của ladpro98

program ptrang;
uses    math;
const   fi='';
var     s,a,f:array[0..6001] of longint;
n,l,res:longint;

procedure input;
var     inp:text;
i:longint;
begin
assign(inp,fi);
reset(inp);
readln(inp,n,l);
for i:=1 to n do
readln(inp,a[i]);
close(inp);
end;

procedure init;
var     i:longint;
begin
s[1]:=a[1];
s[0]:=0;
for i:=2 to n do
s[i]:=s[i-1]+a[i];

end;

function tong(i,j:longint):longint;
begin
exit(s[j]-s[i-1]);
end;

procedure process;
var     i,j:longint;
begin
for i:=1 to n do
begin
f[i]:=high(longint);
for j:=i downto 1 do
if tong(j,i)>l then break
else
f[i]:=min(f[i],max(f[j-1],l-tong(j,i)));
end;

end;

begin

input;
init;
process;
write(f[n]);
end.


#### Code mẫu của RR

program PTRANG;
uses
math;
const
FINP='';
FOUT='';
MAXN=6001;
var
n,l:longint;
d,w,t:array[0..MAXN] of longint;
procedure inp;
var
f:text;
i:longint;
begin
assign(f,FINP); reset(f);
readln(f,n,l);
for i:=1 to n do
readln(f,w[i]);
close(f);
end;
procedure ans;
var
f:text;
begin
assign(f,FOUT); rewrite(f);
writeln(f,d[n]);
close(f);
end;
procedure solve;
var
i,j:longint;
begin
t[0]:=0;
for i:=1 to n do t[i]:=t[i-1]+w[i];
for i:=1 to n do
begin
d[i]:=l;
for j:=i downto 1 do
begin
if t[i]-t[j-1]>l then break;
d[i]:=min(d[i],max(l-(t[i]-t[j-1]),d[j-1]));
end;
end;
end;
begin
inp;
solve;
ans;
end.


#### Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
main()
{ int a[6002],b[6002],t,j,n,l,max;
scanf("%d %d",&n,&l);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[0]=0;
for(int i=1;i<=n;i++)
{ b[i]=l;
t=l;
j=i;
while(j!=0)
{ t=t-a[j];
if(t<0)
break;
if(t>b[j-1])
max=t;
else max=b[j-1];
if(max<b[i])
b[i]=max;
j--;
}
}
printf("%d",b[n]);
//getch();
}


#### Code mẫu của ll931110

Program PTRANG;
Const
input  = '';
output = '';
Var
n,l: longint;
a,s,F: array[1..6000] of longint;

Procedure init;
Var
fi: text;
i: longint;
Begin
Assign(fi, input);
Reset(fi);
Readln(fi, n, l);
For i:= 1 to n do readln(fi, a[i]);
Close(fi);
End;

Procedure sum;
Var
i: longint;
Begin
s[1]:= a[1];
For i:= 2 to n do s[i]:= s[i - 1] + a[i];
End;

Function max(x,y: longint): longint;
Begin
If x < y then max:= y else max:= x;
End;

Procedure optimize;
Var
i,k: longint;
Begin
F[1]:= l - s[1];
For i:= 2 to n do
Begin
F[i]:= l - s[i];
If F[i] < 0 then F[i]:= 1000000000;

For k:= 1 to i - 1 do
If (F[i] > max(F[k], l - (s[i] - s[k]))) and (l - (s[i] - s[k]) >= 0)
then F[i]:= max(F[k], l - (s[i] - s[k]));
End;
End;

Procedure solve;
Var
fo: text;
Begin
Assign(fo, output);
Rewrite(fo);
Writeln(fo, F[n]);
Close(fo);
End;

Begin
init;
sum;
optimize;
solve;
End.


#### Code mẫu của khuc_tuan

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int L = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i)
a[i] = sc.nextInt();
int[] f = new int[n];
for (int i = 0; i < n; ++i) {
f[i] = Integer.MAX_VALUE;
for (int j = i, s = 0; j >= 0; --j) {
s += a[j];
if (s > L)
break;
f[i] = Math.min(f[i], Math.max(L - s, j == 0 ? 0 : f[j - 1]));
}
}
System.out.println(f[n - 1]);
}
}


## Comments

Please read the guidelines before commenting.

There are no comments at the moment.