POJ3273-Monthly Expense-二分答案
FJ对以后的每一天会花mi块钱,他想把这些天分成M个时段,然后每个时段的花费和最小。
二分答案,如果加上这天还没有达到mid,就加上它。之后看分成的时段是否大于M
#include <cstdio> #include <algorithm> using namespace std; int n,m,money[100100]; int judge(int mid) { int group = 1,sum = 0; for(int i=0;i<n;i++) { if(sum+money[i] <= mid) { sum += money[i]; } else { group++; sum = money[i]; } } if(group > m) return false; else return true; } int main() { while(~scanf("%d%d",&n,&m)) { int low=0,high=0; for(int i=0;i<n;i++) { scanf("%d",&money[i]); high += money[i]; low = max(low,money[i]); } int mid = (low+high)/2; while(low < high) { if(!judge(mid)) low = mid+1; else high = mid-1; mid = (low+high)/2; } printf("%d\n",mid); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步