#1128 : 二分·二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )
2015-04-12 22:27
591 查看
#1128 : 二分·二分查找
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
Nettle最近在玩《艦これ》,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位)。去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高。
Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的。如果是重复的,那么这艘船在Nettle所有的船里面稀有值排多少位。
问题一
Nettle已经先把自己所有船按照稀有值从小到大排列好了(a[1..N]),我们要做的是看看新得到的船(假设稀有值为K)是否在这个序列中,且有对应的a[i]=K时,i为多少?
提示一:有序数组的二分查找
问题二
因为Nettle的船太多了,他不愿意去给所有船按照稀有值排序,而是直接告诉了我们每一艘船的稀有值。在这种情况下我们该如何解决这个问题呢?
提示二:非有序数组的二分查找
输入
第1行:2个整数N,K。N表示数组长度,K表示需要查找的数;
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。
输出
第1行:一个整数t,表示K在数组中是第t小的数,若K不在数组中,输出-1。
样例输入
10 5180
2970 663 5480 4192 4949 1 1387 4428 5180 2761
样例输出
9
//先排序在二分 48ms
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
Nettle最近在玩《艦これ》,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位)。去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高。
Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的。如果是重复的,那么这艘船在Nettle所有的船里面稀有值排多少位。
问题一
Nettle已经先把自己所有船按照稀有值从小到大排列好了(a[1..N]),我们要做的是看看新得到的船(假设稀有值为K)是否在这个序列中,且有对应的a[i]=K时,i为多少?
提示一:有序数组的二分查找
问题二
因为Nettle的船太多了,他不愿意去给所有船按照稀有值排序,而是直接告诉了我们每一艘船的稀有值。在这种情况下我们该如何解决这个问题呢?
提示二:非有序数组的二分查找
输入
第1行:2个整数N,K。N表示数组长度,K表示需要查找的数;
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。
输出
第1行:一个整数t,表示K在数组中是第t小的数,若K不在数组中,输出-1。
样例输入
10 5180
2970 663 5480 4192 4949 1 1387 4428 5180 2761
样例输出
9
//先排序在二分 48ms
#include<cstdio> #include<algorithm> //#include<bits/stdc++.h> using namespace std; template<class T>inline T read(T&x) { char c; while((c=getchar())<=32)if(c==EOF)return 0; bool ok=false; if(c=='-')ok=true,c=getchar(); for(x=0; c>32; c=getchar()) x=x*10+c-'0'; if(ok)x=-x; return 1; } template<class T> inline T read_(T&x,T&y) { return read(x)&&read(y); } template<class T> inline T read__(T&x,T&y,T&z) { return read(x)&&read(y)&&read(z); } template<class T> inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template<class T>inline void writeln(T x) { write(x); putchar('\n'); } //-------ZCC IO template------ const int maxn=1000011; const double inf=999999999; #define lson (rt<<1),L,M #define rson (rt<<1|1),M+1,R #define M ((L+R)>>1) #define For(i,t,n) for(int i=(t);i<(n);i++) typedef long long LL; typedef double DB; typedef pair<int,int> P; #define bug printf("---\n"); #define mod 10007 LL a[maxn]; int bs(int left,int right,int key) { while(left<=right) { int mid=(left+right)>>1; if(key==a[mid])return mid; else if(a[mid]>key) right=mid-1; else left=mid+1; } return -1; } int main() { //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); //#endif // ONLINE_JUDGE int n,m,i,j,k,t; while(read_(n,k)) { For(i,1,n+1) { read(a[i]); } sort(a+1,a+n+1); writeln(bs(1,n+1,k)); } return 0; }
//用二分的思想, 28ms #include<cstdio> #include<algorithm> //#include<bits/stdc++.h> using namespace std; template<class T>inline T read(T&x) { char c; while((c=getchar())<=32)if(c==EOF)return 0; bool ok=false; if(c=='-')ok=true,c=getchar(); for(x=0; c>32; c=getchar()) x=x*10+c-'0'; if(ok)x=-x; return 1; } template<class T> inline T read_(T&x,T&y) { return read(x)&&read(y); } template<class T> inline T read__(T&x,T&y,T&z) { return read(x)&&read(y)&&read(z); } template<class T> inline void write(T x) { if(x<0)putchar('-'),x=-x; if(x<10)putchar(x+'0'); else write(x/10),putchar(x%10+'0'); } template<class T>inline void writeln(T x) { write(x); putchar('\n'); } //-------ZCC IO template------ const int maxn=1000011; const double inf=999999999; #define lson (rt<<1),L,M #define rson (rt<<1|1),M+1,R #define M ((L+R)>>1) #define For(i,t,n) for(int i=(t);i<(n);i++) typedef long long LL; typedef double DB; typedef pair<int,int> P; #define bug printf("---\n"); #define mod 10007 LL a[maxn]; int bs(int left,int right,int key) { if(left>right) { if(a[left]==key)return left-1; else return -1; } int mid=a[left]; int low=left; int high=right; while(low<high) { while(low<high&&a[high]>=mid) high--; if(low<high)swap(a[high],a[low]); while(low<high&&a[low]<=mid) low++; if(low<high)swap(a[high],a[low]); } if(mid<key) return bs(low+1,right,key); else return bs(left,low-1,key); } int main() { //#ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); //#endif // ONLINE_JUDGE int n,m,i,j,k,t; while(read_(n,k)) { For(i,1,n+1) { read(a[i]); } writeln(bs(1,n+1,k)); } return 0; }
相关文章推荐
- #1133 : 二分·二分查找之k小数(优先队列或SBT或排序)
- #1133 : 二分·二分查找之k小数 ( 快速排序, 分治 OR nth_element() 函数)
- [bzoj3343]&&[洛谷2810] [分块][块内排序][二分查找]教主的魔法
- 文件中查找字符串(自己写的两种方法,便于以后直接用了)
- php二分查找的两种实现方法
- 二分·二分查找之k小数
- 二分查找的两种实现方法
- (一)排序简介:直接插入排序、冒泡排序、二分查找排序
- 各种排序方法(冒泡,快速,插入,选择),二分查找
- 递归的定义以及递归的示例(计算阶乘、计算斐波那契数、递归二分查找、回文串递归方法解决、汉诺塔问题、递归选择排序问题)
- 二分查找的两种实现方法
- hihoCoder 1133 二分·二分查找之k小数
- Java 数序和集合框架的转化 & Collection.sort()方法排序的两种方式
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
- 二分查找 (循环、递归两种方法)
- 优化的直接插入排序(二分查找插入排序,希尔排序)
- 使用递归和非递归两种方法实现二分查找!!!
- 题目1 : 二分·二分查找
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)