首页 > 代码库 > poj 3273

poj 3273

/*
  题意:给定n,m,然后n个数字,要求一个最小的lim
  使得这连续n个数字可以被分为连续的m个集合,每个集合的和都不大于Lim
/*
#include <iostream>#include <cstdio>#define range(i,a,b) for (int i=a;i<=b;i++)using namespace std;const int maxn =100000;int Cost[maxn+1];int L,R;int n,m;bool check(int val){ int sum(0); int ans(0); range(i,1,n) if (Cost[i]>val) return 0; else if (sum+Cost[i]<=val) { sum+=Cost[i]; } else { sum=Cost[i]; ans++; } if (sum!=0) ans++; return ans<=m;}int main(){ cin>>n>>m; L = R = 0; range(i,1,n) { scanf("%d",&Cost[i]); R+=Cost[i]; } range(c,1,100) { int M = (L+R)>>1; if (check(M)) R=M; else L=M; } if (check(L)) cout<<L<<endl; else cout<<R<<endl; return 0;}

 

poj 3273