POJ 3273 Monthly Expense (二分最值)
2016-01-28 11:37
507 查看
题目大意:在n个连续序列中找到m个分块使得,m块中的最大值(和的max)最小。
思路:直接以max(a[i])为下界,sum(a[0~n-1])为上界去二分。当前的分组和大于m时,应该将当前的枚举范围的值变大。
思路:直接以max(a[i])为下界,sum(a[0~n-1])为上界去二分。当前的分组和大于m时,应该将当前的枚举范围的值变大。
#include<map> #include<queue> #include<cmath> #include<iostream> #include<cstdio> #include<stack> #include<cstring> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; int cnt; struct node{ int to,w,next; }q[101010*4]; int n,m; long long a[100100]; bool fi(long long tmp){ long long t=0,p=1; for(int i=0;i<n;i++){ t+=a[i]; if(t>tmp){ //t-=a[i]; t=a[i]; p++; } } if(p>m)return false; return true; } int main(){ int i,j,k; while(~scanf("%d%d",&n,&m)){///找最小连续分块和中的最大值 long long s=0,ma=0,l,r; for(i=0;i<n;i++){ scanf("%lld",&a[i]); s+=a[i]; ma=max(ma,a[i]); } if(n==m){ printf("%lld\n",ma);continue; } r=s; l=ma; long long mid,ans; while(l<=r){ mid=(l+r)>>1; if(!fi(mid)){ l=mid+1; } else{ r=mid-1; ans=mid;///取不断趋于要求的值 } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- 快速排序里的学问:从猜数字开始
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)