#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int n,m;
int b_find(int q){
int l=1,r=n;
while(l<r){
int mid = l + r >> 1;
if(a[mid] >= q)r = mid;
else l = mid + 1;
}
return l;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(m--){
int q;
cin>>q;
int c = b_find(q);
if(a[c] != q)cout<<"-1 ";
else cout<<c<<" ";
}
return 0;
}
数的范围
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int q[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>q[i];
while (m -- ){
int x;
cin>>x;
int l=0,r=n-1;
int mid = 0;
while(l<r){
mid = l + r >> 1;
if(q[mid] >= x)r = mid;
else l = mid + 1;
}
if(q[l] != x){
cout<<"-1 -1"<<endl;
}else{
cout<<l<<" ";
l=0,r=n-1;
while(l<r){
mid = l + r + 1 >> 1;
if(q[mid] <= x)l = mid;
else r = mid - 1;
}
cout<<l<<endl;
}
}
return 0;
}
木材加工
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N];
int n;
LL C;
bool check(int x){
//计算y
LL y = 0;
for(int i=0;i<n;i++){
y += a[i] / x;
}
return y>=C;
}
int b_find(){
int l = 0,r = 1e8;
while(l<r){
int mid = l + r + 1 >> 1;
if(check(mid))l = mid;
else r = mid - 1;
}
return l;
}
int main()
{
cin>>n>>C;
for(int i=0;i<n;i++)cin>>a[i];
cout<<b_find();
return 0;
}
[NOIP2015 提高组] 跳石头
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N];
int n,L,C;
bool check(int x){
//计算y
int last=0,y=0;
for(int i=1;i<=n;i++){
if(a[i] - a[last] < x)y++;
else last = i;
}
return y<=C;
}
int b_find(){
int l = 0,r = 1e9;
while(l<r){
int mid = l + r + 1 >> 1;
if(check(mid))l = mid;
else r = mid - 1;
}
return l;
}
int main()
{
cin>>L>>n>>C;
for(int i=1;i<=n;i++)cin>>a[i];
a[++n] = L;
cout<<b_find();
return 0;
}