您的位置:首页 > 其它

POJ 3273 Monthly Expense 【二分答案】

2015-05-31 19:42 459 查看
题意:给出n天的花费,需要将这n天的花费分成m组,使得每份的和尽量小,求出这个最小的和

看题目看了好久不懂题意,最后还是看了题解

二分答案,上界为这n天花费的总和,下界为这n天里面花费最多的那一天

如果mid>=m,说明mid偏小,l=mid+1,

如果mid<m,说明mid偏大,r=mid,

#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;

typedef long long LL;
const int INF = (1<<30)-1;
const int mod=1000000007;
const int maxn=1000005;

int a[maxn];
int n,m,k;

int ok(int v){
int ans=0;
int cnt=0;
for(int i=1;i<=n;i++){
ans+=a[i];
if(ans>v){
ans=a[i];
cnt++;
}
}
if(cnt>=m) return 0;
return 1;
}

int main(){
while(scanf("%d %d",&n,&m)!=EOF){
int minn=-1,maxx=0;
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
maxx+=a[i];
minn=max(minn,a[i]);
}

LL l=minn,r=maxx,mid;
while(l<r){
mid=(l+r)/2;
if(ok(mid)) r=mid;
else l=mid+1;
//    printf("l=%d\n",l);
//    printf("r=%d\n",r);
//    printf("mid=%d\n",mid);
}

printf("%I64d\n",l);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: