poj 3273(二分+贪心)
来源:互联网 发布:南极旅游 知乎 编辑:程序博客网 时间:2024/06/07 12:06
题意:
有N天,第i天消耗money_i钱数,现在让你将这N天分成M份,且必须是连续的,求M份中消耗的和的最小值。
解题思路:
二分消耗结果,看是否能分成M份,如果<=M份说明当前和太大,如果>M,份说明和太小,以此作为二分依据。
注意:
无
#include <string.h>#include <stdio.h>#include <stdlib.h>#define MAXN0 100010#define r1(x) (x)>>1int N,M;int mon[MAXN0],sum;int solve(){ int ans = 0; int L,R,Mid; L = 1,R = sum; int num,Maxmon,ans1; ans1 = 0; bool flag = false; while(L<R){ Mid = r1(L+R); ans = mon[0]; num = 1; Maxmon = mon[0]; for(int i=1;i<N;++i){ if(ans+mon[i]<=Mid){ ans+=mon[i]; if(Maxmon<ans){ Maxmon = ans; } continue; } ans = mon[i]; if(Maxmon<ans){ Maxmon = ans; } num++; } if(num<=M){ if(num==M){ if(!flag){ ans1 = Maxmon; flag = true; } else { if(ans1>Maxmon){ ans1 = Maxmon; } } } R = Mid; } else{ L = Mid+1; } } Maxmon = mon[0]; ans = mon[0]; Mid = L; for(int i=1;i<N;++i){ if(ans+mon[i]<=Mid){ ans+=mon[i]; if(Maxmon<ans){ Maxmon = ans; } continue; } ans = mon[i]; if(Maxmon<ans){ Maxmon = ans; } //num++; } if(flag){ if(ans1>Maxmon){ ans1 = Maxmon; } } else { ans1 = Maxmon; } return ans1;}int main(){ while(scanf("%d%d",&N,&M)!=EOF){ sum = 0; for(int i=0;i<N;++i){ scanf("%d",&mon[i]); sum+=mon[i]; } int ans = solve(); printf("%d\n",ans); } return 0;}
0 0
- poj 3273(二分+贪心)
- POJ 3273 Monthly Expense 二分+贪心
- poj 3273 Monthly Expense(二分+贪心)
- POJ 3273-Monthly Expense(二分+贪心)
- POJ 3273 :Monthly Expense【二分+贪心】
- POJ 1505(二分+贪心)
- POJ 1505:二分枚举+贪心
- 【POJ 3122】 Pie (二分+贪心)
- POj-3104 Drying 二分+贪心
- Poj 3122 Pie 二分+贪心
- POJ 2456 疯牛(二分+贪心)
- POJ 1505 Copying Books 二分 + 贪心
- poj 2456 Aggressive cows(贪心+二分)
- POJ 2456 Aggressive cows(二分+贪心)
- poj 2456 Aggressive cows(贪心+二分)
- poj 3258 River Hopscotch(二分+贪心)
- POJ 2456 Aggressive cows(贪心+二分)
- POJ - 3104 Drying 二分 + 贪心
- C语言 01
- 什么?你还不会写JQuery 插件
- 人工智能动作
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发人员工具 总结
- 如果写一个微博的一个ListView
- poj 3273(二分+贪心)
- hdu 4901 DP
- 安装emacs出现到依赖问题及解决方案
- Great Start
- C语言02
- [WebGL入门]八,着色器的说明和基础
- rhel5.8安装ganglia-3.2.0
- Java Timer 定时器的使用
- [编程之美] PSet2.9 斐波那契数列