POJ - 3273 Monthly Expense 二分
2015-05-11 20:23
281 查看
题目大意:有一个人财政赤字了,每天都要还一定数量的钱,共要还N天。
现在他要求把这N天还的钱变成M次还掉,也就是说不用每天都还了,可以累积一定的天数再还。
现在要求M次还掉的钱中,钱的最大值达到最小,问这个最小值是多少
解题思路:最大值最小,二分解决
枚举的最小值是每天还的钱中的最大值,最大值是每天还的钱的总和
因为每次枚举的钱肯定是大于等于每天还的钱中的最大值的,所以最多可以分成N个集合,然后在算出最小的集合,最小的集合数量就是每一个集合尽量包含更多的天数
现在他要求把这N天还的钱变成M次还掉,也就是说不用每天都还了,可以累积一定的天数再还。
现在要求M次还掉的钱中,钱的最大值达到最小,问这个最小值是多少
解题思路:最大值最小,二分解决
枚举的最小值是每天还的钱中的最大值,最大值是每天还的钱的总和
因为每次枚举的钱肯定是大于等于每天还的钱中的最大值的,所以最多可以分成N个集合,然后在算出最小的集合,最小的集合数量就是每一个集合尽量包含更多的天数
[code]#include<cstdio> #include<cstring> #include<algorithm> 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; }
相关文章推荐
- poj 3273 Monthly Expense(二分穷举)
- POJ 3273 Monthly Expense (二分,最小化最大值)
- [ACM] POJ 3273 Monthly Expense (二分解决最小化最大值)
- POJ 3273 Monthly Expense(二分)
- Poj 3273 Monthly Expense(二分)
- poj 3273 Monthly Expense(二分)
- poj3273——Monthly Expense(二分)
- POJ 3273 Monthly Expense(二分枚举)
- POJ 3273 Monthly Expense (二分)
- POJ - 3273 Monthly Expense(二分)
- poj 3273 Monthly Expense 二分查找
- POJ 3273 Monthly Expense 二分
- POJ 3258:River Hopscotch & POJ 3273:Monthly Expense (二分)
- POJ 3273 Monthly Expense(区间和最大值最小-二分)
- poj 3273 Monthly Expense(二分)
- POJ 3273 Monthly Expense 二分查找的应用
- poj 3273 Monthly Expense(二分搜索之最大化最小值)
- POJ-3273 Monthly Expense(二分)
- 【POJ】3273 - Monthly Expense 二分->最大化最小值
- POJ 3273 Monthly Expense (二分&最大化最小值)