33,025
社区成员




import java.util.Scanner;
public class Main{
/**
* ??????,POJ3273??????????????????????????
*/
public static void main(String[] args) {
// short[] a={100, 400,300,100,500,101,400};
// int N=a.length;
// int K=4;
Scanner cin=new Scanner(System.in);
int N=cin.nextInt();
int K=cin.nextInt();
short[] a=new short[N];
int sum=0;
for(int i=0;i<N;i++){
a[i]=cin.nextShort();
sum+=a[i];
}
int left=0,right=sum;
while(left+1<right){ //????????????
int mid=(left+right)/2; //mid??????????????????
int cd=1; //??????????????????1
int leave=mid; //????????????????????????????????????????????mid
int i=0;
for(;i<N;i++){
if(mid<a[i])
break; //??????????????????mid??????????mid??????????????????????????
if(leave>=a[i]){ //????????????????
leave-=a[i];
}else{
cd++;
if(cd>K)
break; //????????????????????????????????????????????
leave=mid-a[i];
}
}
if(i==N){ //mid????????????????????????????????
right=mid;
}else{ //mid??????????????????????????????????
left=mid;
}
}
System.out.println(right);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
const int INF = 99999999 ;
const int size = 100100 ;
int data[size] ;
int insum ;
int inmax ;
int inn, inm ;
void input()
{
insum = 0 ; inmax = -1 ;
for( int i=1; i<=inn; i++ )
{
scanf( "%d", &data[i] ) ; insum += data[i] ;
inmax = inmax > data[i] ? inmax : data[i] ;
}
}
int test( int mid )
{
int cnt = 1 ; int tsum = 0 ;
for( int i=1; i<=inn; i++ )
{
if( tsum + data[i] > mid )
{
cnt++ ; tsum = data[i] ;
}
else
{
tsum += data[i] ;
}
}
return cnt ;
}
void process()
{
int left = inmax ; int right = insum ; int mid ;
while( left < right )
{
mid = ( (left+right)/2 ) ;
int cnt = test( mid ) ;
if( cnt > inm ) left = mid + 1 ;
else right = mid ;
}
printf( "%d\n", right ) ;
}
int main()
{
//freopen( "in.txt", "r", stdin ) ;
while( scanf( "%d %d", &inn, &inm ) != EOF )
{
input() ;
process() ;
//output() ;
}
return 0 ;
}