【动规】【二分】划分数列
来源:互联网 发布:python in用法 编辑:程序博客网 时间:2024/05/16 11:41
2.划分数列(seq.pas/c/cpp)
【题目描述】
给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小
【输入格式】
第一行两个正整数n,k
第二行为此数列ai
【输出格式】
一行一个数,为题目所求答案
【样例输入】
5 2
2 1 3 4 5
【样例输出】
9
【数据规模】
30%数据 n <= 30, k <= 10
100%数据 n <= 100000, k <= n, ai <= 10^9
【时限】
1s
前面已经说了,如果只用动规,是O(n3)的时间复杂度,只能拿50分
而看到这种求最大值最小,或者最小值最大的题(类似关押罪犯)就应该想到去二分答案,就能拿100分
C++ Code
#include<cstdio>#include<string>using namespace std;#define MAXN 100000+10int n,m,a[MAXN],sum;bool ok(int mm){ int num=0,s=0,i=0; while(true) { s=0; while(true) { if(i>=n){num++;break;} if(s+a[i+1]<=mm) { s+=a[i+1]; i++; } else if(s+a[i+1]>mm){num++;break;} } //printf("s=%d i=%d num=%d\n",s,i,num); if(i>=n)break; } if(num<=m)return true;else return false;}int main(){ freopen("seq.in","r",stdin); freopen("seq.out","w",stdout); scanf("%d%d",&n,&m); int i; for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } int l=1,r=sum,mid; while(l<r) { mid=l+(r-l)/2; //printf("l=%d r=%d mid=%d\n",l,r,mid); if(ok(mid))r=mid;else l=mid+1; } printf("%d",r);}
- 【动规】【二分】划分数列
- 【二分】划分数列
- 动规:数的划分
- 二分,贪心,动规
- 动规-洛谷P1415 拆分数列
- 【BZOJ1044】【HAOI2008】木棍分割 二分+动规
- Uva 11584划分回文串(动规)
- 区间动规——凸多边形的三角划分
- hdu3727Jewel(划分树+二分)
- 连续元素划分,二分答案
- HDU 4417 划分树+二分
- hdu4417(划分树)--二分
- hdu 4417 划分树+二分
- HDU 4417 划分树+二分
- DP的另一个角度 数列划分
- 贝尔数列_集合的划分
- 动规
- 动规
- 带权中位数
- 【带权中位数】安装服务器
- 【动规递推】最大数列
- 【动规递推】迷宫
- 【字符串处理】【模拟】NBA工资
- 【动规】【二分】划分数列
- 【模拟】【打表】无聊的游戏
- 【动规递推】暴走的猴子
- java基础
- 【最短路】【NOIP2001】CAR的旅行路线
- 【动规递推】【NOIP2001】统计单词个数
- 【枚举暴搜】【NOIP2001】数的划分
- struts2中s:iterator 标签的使用详解 及 OGNL用法
- 【枚举暴搜】【NOIP2001】一元三次方程求解