poj 1505 or uva 714 copying books 二分法
2015-03-16 15:33
537 查看
题目大意:把一个包含m个正整数的序列分成k个(1=<k<=m<=500)非空的连续子序列,使得每个正整数恰好属于一个序列。设第i个序列的各数之和为si,要求使si的最大值尽量小。如果有多解,s1尽量小,以此类推。序列中的数不超过10^7。
方法:所有子序列之和肯定满足区间 [ 序列中最大的数,所有数之和 ] ,然后对这个区间进行二分,从右往左扫一遍序列,求得<=mid(区间的中点)的子序列的最大和,在此过程中,需要将插入隔板的位置标记下来,如果当前最大和是最小的,要将隔板的位置赋给当前最佳位置的ans数组。至于如何具体处理,详见代码(通俗易懂)。
AC代码:
方法:所有子序列之和肯定满足区间 [ 序列中最大的数,所有数之和 ] ,然后对这个区间进行二分,从右往左扫一遍序列,求得<=mid(区间的中点)的子序列的最大和,在此过程中,需要将插入隔板的位置标记下来,如果当前最大和是最小的,要将隔板的位置赋给当前最佳位置的ans数组。至于如何具体处理,详见代码(通俗易懂)。
AC代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<set> using namespace std; int m,k; int p[505],ans[505],a[505]; void f(int l,int r) { if(l>r) { return; } int mid,K,da,sum,i,ff,j; //cout<<"l:"<<l<<" "<<"r:"<<r<<endl; mid=(l+r)/2; //cout<<"mid:"<<mid<<endl; memset(a,0,sizeof(a)); sum=0; K=k-1; da=0; for(i=m-1;i>0;i--) { if(i==K) { ff=1; break; } if(K==0) { ff=0; break; } sum+=p[i]; //cout<<sum+p[i-1]<<endl; if(sum+p[i-1]>mid) { //cout<<1<<endl; if(sum>da) { da=sum; } sum=0; a[i-1]=1; K--; } //cout<<"sum:"<<sum<<endl; } if(ff) { for(j=i;j>=0;j--) { if(j==i) { if(p[j]+sum>da) { da=p[j]+sum; } if(j!=0) { a[j-1]=1; } continue; } if(p[j]>da) { da=p[j]; } if(j!=0) { a[j-1]=1; } } } else { sum=0; for(j=i;j>=0;j--) { sum+=p[j]; } if(sum>da) { da=sum; } } //cout<<"da:"<<da<<endl; if(da<=mid) { for(i=0;i<m;i++) { ans[i]=a[i]; } f(l,da-1); } else { f(mid+1,r); } } int main() { int t,i,sum,maxp; cin>>t; while(t--) { cin>>m>>k; maxp=0; sum=0; for(i=0;i<m;i++) { cin>>p[i]; sum+=p[i]; maxp=max(maxp,p[i]); } memset(ans,0,sizeof(ans)); //cout<<"maxp:"<<maxp<<endl; //cout<<"sum:"<<sum<<endl; f(maxp,sum); for(i=0;i<m;i++) { cout<<p[i]; if(i<m-1) { cout<<" "; } if(ans[i]) { cout<<"/ "; } } cout<<endl; } return 0; }
相关文章推荐
- UVA-714/POJ-1505 Copying Books
- UVa 714 & POJ 1505 & ZOJ 2002 - Copying Books
- uva 714 Copying Books(二分法求最大值最小化)
- uva 714 Copying Books(二分法求最大值最小化)
- UVa 714 - Copying Books
- UVa 714 - Copying Books
- uva 714 Copying Books
- UVA 714 Copying Books
- poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)
- poj 1505 Copying Books
- uva 714 - Copying Books(二分+贪心)
- UVa 714 - Copying Books
- uva 714 - Copying Books(贪心 最大值最小化 二分)
- UVa 714 - Copying Books,最大值最小化问题
- uva714 - Copying Books
- POJ 1505 Copying Books
- POJ 1505 Copying Books
- UVA 714 Copying Books
- uva 714 Copying Books
- 【POJ】1505 Copying Books