标签:
题意:看着样例说吧 先给你n,m。接着是n行数据,然后要求你把这n行数据分成m份(同一份数据必须是挨着的),使的各份的和尽量小,输出值最大的那一份。
分析:单纯模拟会超时 我用的二分,左边界假设m==n,则ans为所输入数据中最大的那一个。右边界假设m==1,则ans为所输入数据的和。然后不断二分直到两边界重合。
代码:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <ctime> #include <stdlib.h> #include <string.h> #define N 100010 #define INF 10000000 #define eps 10E-9 #define mem(a) memset(a,0,sizeof(a)) #define PI 3.14159265359 using namespace std; int c[N]; int main() { int n,m; while(cin>>n>>m) { int sum=0,maxx=-1; for(int i=0;i<n;i++) { cin>>c[i]; if(c[i]>maxx) maxx=c[i]; sum+=c[i]; } int right=sum; int left=maxx; int mid; while(left<=right) { int cnt=1;//计算分的份数 sum=0; mid=(left+right)/2; for(int i=0;i<n;i++) { if(sum+c[i]<mid) sum+=c[i]; else { sum=c[i]; cnt++; } } if(cnt>m) left=mid+1; else right=mid-1; } cout<<mid<<endl; } return 0; }
标签:
原文地址:http://blog.csdn.net/bigsungod/article/details/43666953