子序列最大和
来源:互联网 发布:淘宝澳洲站 编辑:程序博客网 时间:2024/06/05 05:40
1919: D
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 167 Solved: 35
SubmitStatusWeb Board
Description
晴天想把一个包含n个整数的序列a分成连续的若干段,且和最大的一段的值最小,但他有强迫症,分的段数不能超过m段,然后他就不会分了。。。他想问你这个分出来的和最大的一段的和最小值是多少?
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行为两个整数n,m分别代表序列的长度和最多可分的段数。
接下来一行包含n个整数表示序列。
0<=n<=50000 1<=m<=n,0<=ai<=10000。
Output
输出一个整数表示和最大的一段的最小值。
Sample Input
13 21 3 5
Sample Output
5
HINT
1 3 5 分成一段可以为1 3 5和为9,分成两段可以为1,3 5或者1 3,5,和最大的一段值分别为8,5,所以答案为5
二分最小值,然后验证贪心验证,即若当前最小值是mid,那从第一个数开始累加,每次累加到大于mid时就分成新的一段继续累加,最后判断有多少段。
#include<cstdio> #include<algorithm> using namespace std; int a[50005]; int n,m; bool judge(int mid) { int s=0,cot=0; for(int i=1;i<=n;i++) { if(mid<a[i])//偏小 return false; if(mid>=s+a[i]) s+=a[i]; else { s=a[i];//开始下一个子序列 cot++;//子序列数 if(cot>m-1) return false; } } return true; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); int maxm=0,sum=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); maxm=max(a[i],maxm); sum+=a[i]; } int mid; int l=maxm,r=sum; while(l<r) { mid=(l+r)/2;//二分查找 if(judge(mid)) r=mid; else l=mid+1; } printf("%d\n",l); } return 0; } /************************************************************** Problem: 1919 User: wry Language: C++ Result: Accepted Time:76 ms Memory:1068 kb ****************************************************************/
0 0
- 最大子序列和
- 最大子序列和
- 最大和子序列
- 最大子序列和
- 最大子序列和
- 最大子序列和
- 最大子序列和
- 最大子序列和?
- 最大子序列和
- 最大子序列和
- 和最大子序列
- 最大子序列和
- 最大子序列和
- 最大子序列和
- 最大子序列和
- 最大子序列和
- 最大和子序列
- 最大子序列和
- c语言,fclose()带来的内存错误(求解)
- java exception 和 runtimeException的区别
- EL表达式
- mysql EF6.0 报错:“ Guid 字符串只应包含十六进制字符。”
- Windows RPC 远程过程调用
- 子序列最大和
- hdu 2297 Run 半平面交
- 数组类小案例(重载 '[]' '=' '==' 和 '!=' 运算符)(进阶4)
- ZZULIOJ 1914 天火好帅
- GPUImage中是如果保存OpenGL渲染后的视频的
- MongoDB学习(一)初识NoSql及MongoDB
- 谈谈Material Design之CoordinatorLayout
- Bean Validation 技术规范特性概述
- 响应式和自适应的区别