设为首页 加入收藏

TOP

POJ - 3273 Monthly Expense 二分
2015-11-21 01:02:29 来源: 作者: 【 】 浏览:1
Tags:POJ 3273 Monthly Expense二分

题目大意:有一个人财政赤字了,每天都要还一定数量的钱,共要还N天。
现在他要求把这N天还的钱变成M次还掉,也就是说不用每天都还了,可以累积一定的天数再还。
现在要求M次还掉的钱中,钱的最大值达到最小,问这个最小值是多少

解题思路:最大值最小,二分解决
枚举的最小值是每天还的钱中的最大值,最大值是每天还的钱的总和
因为每次枚举的钱肯定是大于等于每天还的钱中的最大值的,所以最多可以分成N个集合,然后在算出最小的集合,最小的集合数量就是每一个集合尽量包含更多的天数

#include
   
     #include
    
      #include
     
       using namespace std; #define maxn 100010 long long num[maxn],Sum, Min; int N, M; bool judge(long long mid) { int cnt = 1, count; long long money = 0; for(int i = 0; i < N; i++) { money += num[i]; if(money > mid) { money = 0; i--; cnt++; } } if(cnt <= M) return true; return false; } long long solve() { long long l = Min, r = Sum; while(l < r) { long long mid = (l + r) / 2; if(judge(mid)) r = mid - 1; else l = mid + 1; } return l; } int main() { while(scanf("%d%d",&N, &M) != EOF) { Sum = 0, Min = -1; for(int i = 0; i < N; i++) { scanf("%lld", &num[i]); Min = max(Min, num[i]); Sum += num[i]; } printf("%lld\n",solve()); } return 0; } 
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇解题报告 之 POJ2891 Strange Way.. 下一篇POJ1019:Number Sequence

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: