Interesting drink

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 123 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








题目大意:

有一个人想买饮料喝,有n家商店可以卖这个饮料,并且每个商店的价格可能不同,现在告诉你若干天他可以用的钱数,问你他这一天可以在多少家商店买饮料?

问题分析:

其实这是一个很简单的查找问题,若某一天他可以用x元,你要输出的就是小于等于x的商店个数,也就是在价格这个数组中找出x应该插入的位置。最简单的方法是二分查找。。当然,用暴力破解也是可以AC的(其实我明明第一个样例就是暴力破解)

代码:

暴力破解:因为数据范围不大,可以用数组记录对应的数据。

#include<stdio.h>
int main()
{
	int i,x,n,k,max,a[100005],b[100005];
	while(scanf("%d",&n)!=EOF)
	{
		a[0]=b[0]=max=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&x);
			a[x]++;//a[i]记录售价为i的店面个数
			if(x>max) max=x;
		}
		for(i=1;i<=max;i++)
		{
			b[i]=b[i-1]+a[i];//b[i]记录售价小于等于i的店面个数
		}
		scanf("%d",&k);
		while(k--)
		{
			scanf("%d",&x);
			if(x<=max) printf("%d\n",b[x]);
			else printf("%d\n",b[max]);
		}
	}
	return 0;
}



当然,暴力破解不是我们最想要的方法,所以就有了方法2:二分查找

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
	int n,i,j,k,money,l,r,mid,ans;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		sort(a+1,a+1+n);
		scanf("%d",&k);
		while(k--)
		{
			scanf("%d",&money);
			if(money<a[1]) printf("0\n");
			else if(money>=a[n]) printf("%d\n",n);
			else
			{
				l=1; r=n;
				while(l<=r)
				{
					mid=(l+r)/2;
					if(a[mid]<=money)
					{
						ans=mid;
						l=mid+1;
					}
					else
					{
						r=mid-1;
					}
				}
				printf("%d\n",ans);
			}
		}
	}
	return 0;
}
= =这个方法我用自己写的sort超时N次。。。最后不得不放弃,选择调用库函数。。。大概是我的sort写的太丑了吧。。。现在放上来的是AC代码。。不过从测试报告上看,时间空间不比暴力破解快很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值