POJ 3273 (二分&三分_E题)解题报告
题目链接:http://poj.org/problem?id=3273
--------------------------------------------------------
题意:将一个长为M的数串按序分为k组,使得每组和最小。
思路:二分最小化和的题目,二分的标准是每组的和,判断标准是组数。如果组数大于要求的,证明每组和较小,反之,证明每组和较大,利用二分的方法求得。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int N =0; int M =0; const int MAXN =1e5+10; int a[MAXN]; int high=0; int low =0; int jud(int d){ int sum =0; int count =0; for(int i=0;i<N;i++){ if(sum+a[i]<=d){ sum+=a[i]; }else if(a[i]<=d){ count++; sum =a[i]; }else if(a[i]>d){return 1;} } if(count>=M) return 1; else return 0; } int bsearch(){ int left = low; int right =high; int mid; while(right>=left){ mid = (right-left)*0.5+left; if(jud(mid)){ left=mid+1; }else{ right =mid-1; } } return left; } int main(void){ scanf("%d %d",&N,&M); for(int i=0;i<N;i++){ scanf("%d",&a[i]); high+=a[i]; low=min(low,a[i]); } printf("%d\n",bsearch()); return 0; }

浙公网安备 33010602011771号