uva714Copying Books
来源:互联网 发布:origin作图软件功能 编辑:程序博客网 时间:2024/05/16 01:50
这道题反过来是uva的测试数据比较水,有严重错误的代码都能ac。
uva虽然过了,但poj tle,测试了一下,应该是b-a==1有点问题,导致一只在循环里面,纠结中。。。(马上又看了一下,原来是rear取得值有问题,poj ac了)
二分掌握的还不是很好,主要是取中间数(姑且就这么叫它吧)的时候,脑子里有点模糊,不过只要想清楚了就好了。
#include<cstdio>#include<cstring>#include<algorithm>#define MAX 600using namespace std;char ans[MAX];int M,K,s[MAX];long long front,rear;int state(long long value,int tag){ int i,j=0; long long sum=0; for(i=M-1;i>=0;i--) { if(s[i]>value) return -1; sum+=s[i]; if(sum>value) { if(tag==1) { ans[i]=1; } j++; sum=s[i]; } } if(j+1==K) return 0; else if(j+1<K) return 1; else return -1;}void solve(){ long long i,j,a,b,value; a=front,b=rear; if(state(a,0)>=0) { value=a; state(a,1); j=1; for(i=0;i<M;i++) if(ans[i]==1) j++; for(i=0;j<K&&i<M;i++) { if(ans[i]==0) { ans[i]=1; j++; } } } else { while(1) { if(b-a==1) { if(state(a,0)==0) { value=a; state(value,1); break; } value=b; state(value,1); j=1; for(i=0;i<M;i++) if(ans[i]==1) j++; for(i=0;j<K&&i<M;i++) { if(ans[i]==0) { ans[i]=1; j++; } } break; } if(state((a+b)/2,0)>=0) b=(a+b)/2; else a=(a+b)/2; } } for(i=0;i<M;i++) { if(i!=0) printf(" "); printf("%d",s[i]); if(ans[i]) printf(" /"); } //printf("%d\n",value);}int main(){ int n,i,j; scanf("%d",&n); while(n--) { scanf("%d %d",&M,&K); front=0;
memset(ans,0,MAX); for(i=0;i<M;i++) { scanf("%d",&s[i]); if(s[i]>front) front=s[i]; } rear=10000000*(long long)(M/K+2);//有问题,取小了,改成加12ac了 solve(); puts(""); } return 0;}
0 0
- uva714Copying Books
- uva714Copying Books
- books
- books
- books
- books
- Books
- books
- books
- Books
- Books
- books: reference books
- Recommended Books
- c++Books
- Python Books
- Good books
- Books List
- Hacking books
- DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
- python异常
- MeshLab安装在linux下
- 多态性是指统一的接口,不同的表现形式。
- PCB设计资料:看到最后才知道是福利
- uva714Copying Books
- java通过jxl操作excel
- 人脸识别(OpenCV+Python)
- Python IDLE快捷键一览
- 手机触屏触摸特效javascript-TouchSwipe(依赖于jquery库)中文说明
- OSX 虚拟机无法下载安装XCODE 解决方法
- 图像处理中 BMP 和JPG等格式的说明
- LabVIEW上位机与串口通信
- linux调优 性能优化