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[n]){
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[n]){
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;
}