POJ-3273

来源:互联网 发布:微云同步助手mac版 编辑:程序博客网 时间:2024/06/05 06:11

还是二分查找,不过这题注意最后要取upper bound的值为结果,还有这题用贪心的方法分组是对的吗?总感觉这样的分组不一定是最优的啊,但是最后竟然A了。。

#include<cstdio>#include<algorithm>using namespace std;namespace{int N, M, dat[100000];bool check(int limit){int curr = 0, group = 0;for (int i = 0; i < N; i++){if (curr + dat[i] <= limit)curr += dat[i];else{curr = dat[i];group++;}if (group > M)return false;}return ++group <= M;}void solve(int lb, int ub){int mid;while (ub - lb > 1){mid = (lb + ub) / 2;if (check(mid))ub = mid;elselb = mid;}printf("%d\n", ub);}}int main(){scanf("%d %d", &N, &M);int maxx = 0, sum = 0;for (int i = 0; i < N; i++){scanf("%d", &dat[i]);maxx = max(dat[i], maxx);sum += dat[i];}solve(maxx - 1, sum);return 0;}


0 0