light oj 1100 - Again Array Queries(暴力,鸽巢原理)
2015-11-04 15:51
435 查看
http://lightoj.com/volume_showproblem.php?problem=1100
刚一看到这题,要询问这么多次,线段树吧,想多了哈哈,根本没法用线段树做。
然后看看数据范围纯暴力的话肯定超时。然后比赛时就liao那了。
今天是补题,然后做这题,前两发傻逼呵呵的想了一种暴力方法,报着也许能过的心态交了,果然没让我失望超时了。
不说这些没用的了,下面说说这题是咋做的。
没用什么高深的算法,好像算法都没用,就纯暴力写的,关键是加入一种常识来优化。传说中的鸽巢原理,其实有点常识的就会,只不过脑子笨想不到我。
鸽巢原理看这篇博客http://blog.csdn.net/pi9nc/article/details/8506306;
题目给的数据是所给的n个数据的范围为[1,1000];
再看n 给的范围为1e+5;每次询问给你x1,x2,然后找[x1,x2]中两个数相差最小的距离。
那么如过x2-x1>1000,那么在[x1,x2]范围内肯定有重复的数,这个应该很好里解,因为其中每个数的范围都是[1,1000];
假如每个数都不一样那没其中必定有一个数要大于1000,与所给的范围矛盾,然后这种情况特判一下就行。这就用到鸽巢原理了,是不是很简单。
然后每次询问的复杂度就是1000了,那么总的复杂度为q*1000*2;
然后每次询问暴力就行了。
刚一看到这题,要询问这么多次,线段树吧,想多了哈哈,根本没法用线段树做。
然后看看数据范围纯暴力的话肯定超时。然后比赛时就liao那了。
今天是补题,然后做这题,前两发傻逼呵呵的想了一种暴力方法,报着也许能过的心态交了,果然没让我失望超时了。
不说这些没用的了,下面说说这题是咋做的。
没用什么高深的算法,好像算法都没用,就纯暴力写的,关键是加入一种常识来优化。传说中的鸽巢原理,其实有点常识的就会,只不过脑子笨想不到我。
鸽巢原理看这篇博客http://blog.csdn.net/pi9nc/article/details/8506306;
题目给的数据是所给的n个数据的范围为[1,1000];
再看n 给的范围为1e+5;每次询问给你x1,x2,然后找[x1,x2]中两个数相差最小的距离。
那么如过x2-x1>1000,那么在[x1,x2]范围内肯定有重复的数,这个应该很好里解,因为其中每个数的范围都是[1,1000];
假如每个数都不一样那没其中必定有一个数要大于1000,与所给的范围矛盾,然后这种情况特判一下就行。这就用到鸽巢原理了,是不是很简单。
然后每次询问的复杂度就是1000了,那么总的复杂度为q*1000*2;
然后每次询问暴力就行了。
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<string.h> using namespace std; int b[1005]; int main(void) { int aa[100005]; int n,i,j,k,p,q,x1,x2; scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d %d",&p,&q); for(j=0; j<p; j++) { scanf("%d",&aa[j]); } printf("Case %d:\n",i); while(q--) { memset(b,0,sizeof(b)); scanf("%d %d",&x1,&x2); if(x2-x1>1000) { printf("0\n"); }//特判 else { for(j=x1; j<=x2; j++) { b[aa[j]]++; }//记录出现的数字的个数。 int cnt=-1; int vv=2000;//记录最小差距,赋初值大于1000 for(j=1; j<=1000; j++)//从1开始循环到1000,所给的范围为【1,1000】; { if(b[j]>=2) { vv=0; break; }//如果出现重复出现多于一个的直接跳出 if(b[j]!=0&&cnt!=-1) { if(vv>j-cnt) { vv=j-cnt; } cnt=j; } if(cnt==-1&&b[j]!=0) { cnt=j; } }//这样循环是根据数列的递增的性质,出现的前后个数间保证了间距最小。 printf("%d\n",vv); } } } return 0; }
相关文章推荐
- [leetcode] 63. Unique Paths II 解题报告
- getSession().createQuery("from Users");与getHibernateTemplate().find( "FROM Users);
- UIView —— 所有控件的载体
- [leetcode] 62. Unique Paths 解题报告
- (八)jms topic与jms queue区别
- android build Communication error with Jack server (52)
- Android目录介绍&UI简介
- NSFetchRequest CoreData条件搜索
- [扩展]EasyUI给dialog的buttons绑定click事件
- theano, scan关于 theano.scan函数一些简单的应用只包括fn ,sequences 和outputs_info
- easyui tab
- iOS之获取UITableViewCell中UITextField的值方法总结
- UICollectionView(相册大图查看)
- Error: Program "C:\android\android-ndk-r10\ndk-build.cmd" not found in PATH
- UILabel (API+自定义多颜色文本内容)
- 3538: [Usaco2014 Open]Dueling GPS
- 基于QtQuick的二维码解码
- UITableView的cell一些设置
- iOS开发UITableViewCell滚动到特定的行数
- UI界面设计嘚吧嘚