题目:
Vasiliy likes to rest after a hard work, so you may often meet him in some bar nearby. As all programmers do, he loves the famous drink "Beecola", which can be bought in n different shops in the city. It's known that the price of one bottle in the shop i is equal to xi coins.
Vasiliy plans to buy his favorite drink for q consecutive days. He knows, that on the i-th day he will be able to spent mi coins. Now, for each of the days he want to know in how many different shops he can buy a bottle of "Beecola".
Input
The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — the number of shops in the city that sell Vasiliy's favourite drink.
The second line contains n integers xi (1 ≤ xi ≤ 100 000) — prices of the bottles of the drink in the i-th shop.
The third line contains a single integer q (1 ≤ q ≤ 100 000) — the number of days Vasiliy plans to buy the drink.
Then follow q lines each containing one integer mi (1 ≤ mi ≤ 109) — the number of coins Vasiliy can spent on the i-th day.
Output
Print q integers. The i-th of them should be equal to the number of shops where Vasiliy will be able to buy a bottle of the drink on the i-th day.
Example
Input
5 3 10 8 6 11 4 1 10 3 11
Output
0 4 1 5
Note
On the first day, Vasiliy won't be able to buy a drink in any of the shops.
On the second day, Vasiliy can buy a drink in the shops 1, 2, 3 and 4.
On the third day, Vasiliy can buy a drink only in the shop number 1.
Finally, on the last day Vasiliy can buy a drink in any shop.
翻译:
瓦西里喜欢在辛苦工作后休息,所以你可以经常在附近的酒吧见到他。 和所有的程序员一样,他喜欢著名的饮料“Beecola”,在城市的n个不同的商店都能买到。 我们知道商店i中一瓶的价格等于xi个硬币。
瓦西里计划连续几天买他最喜欢的饮料。 他知道,在第i天他将能够花mi币。 现在,他每天都想知道他能在多少家不同的商店买到一瓶Beecola。
输入
输入的第一行包含一个整数n(1≤n≤100 000)——这个城市中出售Vasiliy最喜欢的饮料的商店的数量。
第二行包含n个整数xi(1≤xi≤100 000)-第i个商店中饮料的瓶子的价格。
第三行包含一个整数q(1≤q≤100 000)- Vasiliy计划购买饮料的天数。
然后跟随q行,每一行包含一个整数mi(1≤mi≤109)- Vasiliy在第i天可以花费的硬币数量。
输出
打印问整数。 它们中的第i个应该等于瓦西里在第i天能够买到一瓶饮料的商店的数量。
例子
输入
5
3 10 8 6 11
4
1
10
3.
11
输出
0
4
1
5
请注意
第一天,瓦西里在任何一家商店都买不到饮料。
第二天,Vasiliy可以在1、2、3、4号店买饮料。
第三天,瓦西里只能在1号店买饮料。
最后一天,瓦西里可以在任何商店买到饮料。
思路:
一般可以通过当天的钱币的数量与每个饮料的价格进行比较并进行累加,但这种方法会出现超时的情况,所以我们可以考虑采用二分的办法。
首先,我们需要把饮料的价格进行从大到小的排序;然后使用二分的方法找出小于等于当天钱币的最大值。因为下标是从0开始的所以最大值的下标加1就是能够买的饮料的最大值。当然,我们可以首先判断当天钱币是否大于最大值或者是否小于最小值。如果大于最大值则输出所有饮料的个数即可,如果小于最小值输出0即可。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
long long a[100010];
int main()
{
long long n,i,j,m,d,min,mid,max,k=0;
scanf("%lld",&n);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
scanf("%lld",&m);
for(j=1;j<=m;j++)
{
k=0;
scanf("%lld",&d);
min=0;
max=n-1;
mid=(min+max)/2;
if(d>a[max])
k=max+1;
else if(d<a[min])
k=min;
else
{
while(min<=max)
{
if(d<a[mid])
{
max=mid-1;
mid=(min+max)/2;
}
else if(d>=a[mid])
{
min=mid+1;
mid=(min+max)/2;
}
k=max+1;
}
}
printf("%lld\n",k);
}
return 0;
}