poj1083
2015-09-09 21:59
393 查看
摘要:本题不难,主要要注意将两边的房间区分开来来算,计算每个走廊区间上需要经过次数最多的那个地方,这就是代表走完所有路径需必须要走的次数.明显的,该次数就是总共走的次数的下界,现在需要证明的是走N次一定能够将所有路线都走完.
证明:假设在区间[a,b]上重叠了n个路线,那么可以证明,从对于其中任何一个路线,可以将与其不冲突的路线一起走完,对于区间[a,b],冲突的路线就少了一次.对于不经过[a,b]的路线,可以知道至少每一个存在路线冲突的区间上的冲突次数都会少1.因为它们不会与[a,b]冲突,又因为它们的冲突次数小于等于N,那么N次之后所有的路线都将走完.
``` #include "stdafx.h" #include "cmath" #include "string.h" #include "iostream" using namespace std; void test(int n,int tables) { int corridor[200],i,j,start,end,time,x,y; while(n--) { memset(corridor,0,sizeof(corridor)); time=0; for(i=0;i<tables;i++) { scanf("%d%d",&x,&y); start=((x<y?x:y)-1)/2; end=((x>y?x:y)-1)/2; for(j=start;j<=end;j++) corridor[j]+=10; } for(i=0;i<200;i++) time=corridor[i]>time?corridor[i]:time; printf("%d\n",time); } } int main() { int T,N,Num1,Num2,min,max,T1,N1; int corridor[201] = {0}; cin>>T; T1 = T; while(T--) { memset(corridor,0,sizeof(corridor)); cin>>N; N1 = N; while(N--) { cin>>Num1; cin>>Num2; if(Num1%2==1)//北边的房间 Num1 = (Num1-1)/2; else Num1 = Num1/2 - 1; if(Num2%2==1)//南边的房间 Num2 = (Num2-1)/2; else Num2 = Num2/2 - 1; min = Num1<Num2?Num1:Num2; max = Num1>Num2?Num1:Num2; for(int i = min;i<=max;i++) { corridor[i]++; } } max = 0; for(int i = 0;i<=199;i++) { if(corridor[i]>max) max = max>corridor[i]?max:corridor[i]; } cout<<max*10<<endl; } return 0; }
相关文章推荐
- Android—软键盘弹出时关于布局的问题
- OC08_字典Dictionary
- 双目相机的一个例子
- 代码检查、代码走查与评审
- Openstack部署总结:“部署过程Error: Local ip for ovs agent must be set when tunneling is enabled”问题
- js中SetInterval与setTimeout用法
- Spark 1.4新特性概述
- lintcode-最小路径和-110
- 使用GCE(Google Container Engine)体验容器云服务 (1)
- 自然界的目的,更深层次的密码以及未知的灾难----读《三体》第一部第三节
- Android(java)学习笔记219:开发一个多界面的应用程序之两种意图
- JetBrains公司的 号称C++神器的 Clion
- 机器学习实战——第一章
- 1003--多线程笔记
- MFC 写五子棋用到的知识点
- Environment.getExternalStorageDirectory()与Environment.getExternalStoragePublicDirectory(String type)
- 【面试季一】若干前端面试题
- Best Time to Buy and Sell Stock
- 导航栏
- VMware Containers - VMware vSphere Integrated Containers