ZOJ 2002 Copying Books 二分 贪心
2017-08-19 15:20
567 查看
传送门:Zoj2002
题目大意:从左到右把一排数字k分,得到最小化最大份,如果有多组解,左边的尽量小。
思路:贪心+二分(参考青蛙过河)。
方向:从右向左。
注意:有可能最小化时不够k分。如
3 31 2 3
k分得到最小化的最大值是3,分组却只能分两个组。
错误结果是 1 2 / 3.正确结果是1 / 2 / 3
因此要从左到右补齐‘/’
#include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<memory.h> using namespace std; int n,k; int a[510]; int b[510]; int used; void _update() { memset(b,0,sizeof(b));//开始把0写成false了。。。。尴尬 memset(a,0,sizeof(a)); } bool _judge(long long v) { long long temp; used=0; int i=n; while(i>=1) { temp=0; used++; while(temp+a[i]<=v){ temp+=a[i]; i--; if(i<1) break; } } if(used<=k) return true; return false; } void _Cout(long long v) { long long temp; int i=n; used=0; while(i>=1) { temp=0; used++; while(temp+a[i]<=v){ temp+=a[i]; i--; } b[i]=1; } for(i=1;i<n;i++) { cout<<a[i]<<" "; if(b[i]) cout<<"/ "; else if(used<k) { // 补齐 cout<<"/ "; used++; } } cout<<a <<endl; } int main() { int i,T; cin>>T; while(T--) { _update(); cin>>n>>k; long long Max=0,M=0; for(i=1;i<=n;i++) { cin>>a[i]; M+=a[i]; if(a[i]>Max) Max=a[i]; } long long L=Max,R=M,mid; while(L<R){ mid=(L+R)/2; if(_judge(mid)) R=mid; else L=mid+1; } _Cout(R); } return 0; }
相关文章推荐
- ZOJ 2002 Copying Books 二分 贪心
- ZOJ 2002 Copying Books(二分答案)
- POJ 1505 Copying Books(誊抄书籍)__二分+贪心
- POJ1505:Copying Books(贪心+二分枚举)
- zoj 3963 Heap Partition(并查集,贪心,二分)
- ZOJ 3778 Talented Chef (贪心+二分)
- zoj 2968 Difference Game [贪心+二分]
- UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
- zoj-3963 Heap Partition(贪心+二分+树状数组)
- [贪心&&二分]uva714 Copying Books
- ZJU2002 Copying Books - 二分+贪心大败DP
- UVA 714 Copying Books(二分+贪心)
- ZOJ 3090 Assemble(二分+贪心)
- 浙江14届省赛 F.Heap Partition(ZOJ 3963)[贪心][二分]
- UVa 714 & POJ 1505 & ZOJ 2002 - Copying Books
- ZOJ 3963 Heap Partition( 并查集 + 贪心 +二分 )
- UVA - 714 Copying Books(二分+贪心)
- uva 714 - Copying Books(二分+贪心)
- uva 714 - Copying Books(贪心 最大值最小化 二分)
- 二分,贪心(Copying Books,uva 714)