题干:
瓦西里喜欢在努力工作后休息,所以你可能经常在附近的一些酒吧见到他。他喜欢 "Beecola",可以从 n 个不同的商店买到。在第 i 个商店的价格为 xi 元。
瓦西里计划购买他最喜欢的饮料 q 次。在第 i 天他能花 mi 元。他想知道每天他能在多少个商店中买这些饮料。
Input
第一行包含一个整数 n (1 ≤ n ≤ 100 000) — 表示商店的数量。
第二行包含 n 个整数 xi (1 ≤ xi ≤ 100 000) — 表示第 i个商店饮料的价格。
第三行包含一个整数 q (1 ≤ q ≤ 100 000) — 表示天数。
之后 q 行每行包含一个整数 mi (1 ≤ mi ≤ 109) — 第 i 天能花的钱数。
Output
输出 q 个整数。第 i 行表示第 i 天能在多少个商店中购买。
Example
Input
5
3 10 8 6 11
4
1
10
3
11
Output
0
4
1
5
题目大意:
给你一些商店,100000个询问,问每个询问下,大于等于多少个商店的价格?
解题报告:
二分o(q*logn),可解。因为本题都是整数,所以用lowerbound,upperbound都可以。
AC代码1:(lowerbound)
Select Code
#include<bits/stdc++.h>
using namespace std;
int a[100000 + 5];
int main()
{
int n,q,op,ans;
cin>>n;
for(int i = 1;i <=n; i++) {
scanf("%d",&a[i]);
}
scanf("%d",&q);
sort(a+1,a+n+1);
while(q--) {
scanf("%d",&op);
ans=lower_bound(a+1,a+n+1,op+1)-(a+1);
printf("%d\n",ans);
}
return 0 ;
}
AC代码2:(upperbound)
#include<bits/stdc++.h>
using namespace std;
int a[100000 + 5];
int b[5]={1,2,2,3,4};
int main()
{
// cout<< upper_bound(b,b+5,2)-b;
int n,q,op,ans;
cin>>n;
for(int i = 1;i <=n; i++) {
scanf("%d",&a[i]);
}
scanf("%d",&q);
sort(a+1,a+n+1);
while(q--) {
scanf("%d",&op);
ans=upper_bound(a+1,a+n+1,op)-(a+1);
printf("%d\n",ans);
}
return 0 ;
}
总结: 无