题目描述
科丁星人的进化程度远远领先于地球人,他们的扑克牌也和地球上的扑克牌不一样。科丁星的扑克牌有10^9 种牌,牌上的数字分别从1到10^9 (没有J Q K和大小王)。不像我们地球人每种牌有4张,科丁星的扑克牌每种牌有8张,也就是说科丁星的每副牌有8*10^9 张。科丁星打牌的规则也是牌面上数字越大的牌越厉害。
科丁博士很喜欢打牌,他的牌打的也很好。今天科丁博士又约了实验室的同事一起打牌。科丁博士习惯于按照从左到右,从小到大的顺序拿牌。科丁博士的这一局已经开始了一段时间,科丁博士现在手上有n张牌。科丁博士还是按照他一贯的喜好进行拿牌。科丁博士的上家出了4张x, 现在轮到科丁博士出牌了,如果科丁博士手上所有大于x的牌中有某种牌不少于4张,那么科丁博士就可以压过上家,请你帮助科丁博士算一算他手上的牌能否压过上家? (1≤ n,≤10^6, 1≤ x,≤10^9)。
输入格式
第1行:两个整数n, x(分别代表科丁博士手上牌的数量和科丁博士上家出牌的大小)
第2到第n+1行, n个整数,分别代表科丁博士手上的牌。
输出格式
一行:如果科丁博士能压过上家输出1,否则输出0
输入输出样例
输入样例1:
6 5
1
10
10
10
10
10
输出样例1:
1
输入样例2:
5 10 1 3 10 10 10
输出样例2:
0
【耗时限制】1000ms 【内存限制】128MB
理解方法
二分查找是一种在有序数组中快速定位目标元素的算法。在进行二分查找时,我们可以设置上下界来缩小查找区间,从而提高查找效率。
上下界的意义是确定了一个查找区间,目标元素只可能在这个区间内。通过不断缩小查找区间,我们可以将查找范围从整个数组缩小到最终只剩下一个元素,从而找到目标元素。
在二分查找中,上界和下界的设置非常重要。如果上界太大或下界太小,会导致查找区间过大,降低查找效率;如果上界太小或下界太大,可能导致目标元素不在查找区间内,无法找到目标。
因此,在进行二分查找时,需要根据具体问题设置合适的上下界,以保证查找的有效性和高效性。
代码展示
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int up(int l,int r,int x){
while(l<r){
int mid=(l+r)/2;
if(a[mid]>x) r=mid;
else l=mid+1;
}
return l;
}
int low(int l,int r,int x){
while(l<r){
int mid=(l+r)/2;
if(a[mid]>=x) r=mid;
else l=mid+1;
}
return l;
}
int main(){
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int p=low(1,n+1,x+1);
for(int i=p;i<=n;i++){
int s=low(1,n+1,a[i]);
int t=up(1,n+1,a[i]);
if(t-s>=4){
cout<<1;
return 0;
}
}
cout<<0;
return 0;
}
希望大家喜欢(❤ ω ❤)