大家好!
今天,是我出题的第一天,今天根据二分的知识点,我出了一个题《小可的序列》。
看题:
小可的序列
时间限制:1秒 内存限制:128M
题目描述
小可最近学习了“二分”这个算法,于是,他请求他的爸爸给他考一考。
输入描述
第一行,一个整数k(1<=k<=10),表示有k输入;
第k行,一个n(1<=n<=1000),一个x(1<=x<=100000),n个元素的序列(1<=a[i]<=100000)。
输出描述
共k行,每行两个整数,分别是比x小(等于)且最大,比x大(等于)且最小。
样例输入
3
7 3
1 1 2 2 3 5 9
5 4
2 3 4 11 14
2 1
1 1
样例输出
3 3
4 4
1 1
那么好,我们来分析一下题目:
这个题,总归是让你用二分算法中“最大化答案”和“最小化答案”求值。
OK!废话不多说,不多说废话,相信大家也都不喜欢说废话,那我也不说废话,我坚决不说废话!
好,那我们不说废话,上AC代码:
#include<bits/stdc++.h>
using namespace std;
int k,a[1005],n,x;
bool Bigcheck(int mid){
return a[mid]<=x;
}
bool Smallcheck(int mid){
return a[mid]>=x;
}
int main(){
scanf("%d",&k);
while(k--){
scanf("%d%d",&n,&x);
for(int i=1;i<=n;i++) scanf("%d",a+i);
int L=1,R=n;
while(L<R){
int mid1=(L+R)/2;
if(Smallcheck(mid1)) R=mid1;
else L=mid1+1;
}
cout<<a[L]<<" ";
while(L<R){
int mid2=(L+R+1)/2;
if(Bigcheck(mid2)) L=mid2;
else R=mid2-1;
}
cout<<a[L]<<"\n";
}
return 0;
}
OK!废话不多说,不多说废话,相信大家也都不喜欢说废话,那我也不说废话,我坚决不说废话!
再见!