题目:
从前有一个肥宅黄先生,一天他心血来潮地想去锻炼(其实是为了他的女神),然而他每天的体力值都不一样,他希望你能帮他找出他一天可以走多少条路。
输入说明:
有n(1<=n<=10^5)段路程,接下来n个数代表走完这段路需要的体力值si(1<=s<=maxlongint)。
有m(1<=m<=10^5)天,接下来m行代表他每天的体力值k(1<=k<=maxlongint)他一天可以走完小于等于他体力值k的路。
输出说明:
有m行,接下来每个数代表他那天可以走多少段路程。
题解:
思路:
这题是枚举题,但数据大,无法直接枚举。那么可以用二分来写。
用二分来枚举体力值所能走的最大的路,很明显,这是枚举右端点。
找到了体力值所能走的最大的路后,就可以直接输出了。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[600005],x,y;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
cin>>y;
for(int i=1;i<=y;i++){
scanf("%lld",&x);
int l=0,r=n+1,m;
while(l+1<r){
m=(l+r)/2;
if(a[m]<=x){
l=m;
}
else{
r=m;
}
}
if(a[l]==x)printf("%lld\n",l);
else printf("%lld",l-1);
}
return 0;
}
谢谢观看。