您的位置:首页 > 其它

Codeforces Round #367 (Div. 2) B Interesting drink【二分】

2016-08-12 09:55 429 查看

Codeforces Round #367 (Div. 2) B Interesting drink 【二分】

题目链接:http://codeforces.com/contest/706/problem/B

题意:每次寻找q次, 在n个数字里面找到 <=t 的个数

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define eps 1e-6
#define pi 3.14159265359
typedef long long LL;
const int maxn = 100100;
LL i,n,m,k,t;
LL a[maxn];
int main(){
while(~scanf("%lld",&n)){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
scanf("%lld",&k);
while(k--){
scanf("%lld",&t);
int so = upper_bound(a+1,a+n+1,t)-a-1;
//搜索 >=t 的第一个元素位置
printf("%d\n",so);
}
}
return 0;
}


upper_bound() 就是二分搜索,手写的有毒WA n发,时间效率是一样的

搜索左边le

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define eps 1e-6
#define pi 3.14159265359
typedef long long LL;
const int maxn = 100100;
LL j,i,n,m,k,t;
LL a[maxn];
int main(){
while(~scanf("%lld",&n)){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
scanf("%lld",&k);
while(k--){
scanf("%lld",&t);
if(t<a[1]){
printf("0\n");
continue;
}
if(t>=a
){
printf("%lld\n",n);
continue;
}
int flag1 = 0;
LL x,mi,le = 1,ri = n;
while(le<ri){
mi = (le+ri)/2;
if(t>=a[mi]){// >=t的第一个元素
le = mi+1;
}else{
ri = mi;
}
}
printf("%lld\n",le-1);
}
}
return 0;
}


搜索中间mi

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 100100;
LL j,i,n,m,k,t;
LL a[maxn];
int main(){
while(~scanf("%lld",&n)){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
scanf("%lld",&k);
while(k--){
scanf("%lld",&t);
if(t<a[1]){
printf("0\n");
continue;
}
if(t>=a
){
printf("%lld\n",n);
continue;
}
int flag1 = 0;
LL x,mi,le = 1,ri = n;
while(le<=ri){
mi = (le+ri)/2;
if(t>=a[mi]){
x = mi;
le = mi+1;
}else{
ri = mi-1;
}
}
printf("%lld\n",x);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces 搜索