首页 > 代码库 > poj Monthly Expense(最大值最小化)
poj Monthly Expense(最大值最小化)
Monthly Expense
题目链接:Click Here~
题目分析:
给出N个数,要求你合并连续的数,使其合并在满足不差过M个合并后的集合的时候,不超过M个集合的和的最大值最小。
思路分析:
1、二分集合的和的最小值。
2、C:判断是否满足集合不超过M个?
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAXN = 100000 + 10; const int INF = ~0U >> 2; int mony[MAXN]; int N,M; bool C(int m){ int j,cnt = 0; for(int i = 0;i < N;i = j){ if(mony[i] > m) return false; int sum = 0; j = i; while(j < N&&sum + mony[j] <= m){ sum += mony[j]; ++j; } cnt++; } return cnt <= M; } void solve(){ int lb = -1,ub = INF; while(ub - lb > 1){ int mid = (lb + ub) / 2; if(C(mid)) ub = mid; else lb = mid; } printf("%d\n",ub); } int main() { while(~scanf("%d%d",&N,&M)){ for(int i = 0;i < N;++i) scanf("%d",&mony[i]); solve(); } return 0; }
poj Monthly Expense(最大值最小化)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。