2.H : 比k大的数

 Time Limit: 2 Sec     Memory Limit: 128 Mb


Description

给出一个由n个整数组成的数列 a1, a2, a3, ..., an

之后给出m个整数k。 问:对于每一个k,数列中有多少个数比k大?

Input

输入共包括三行

第一行是两个由空格隔开的正整数n和m

第二行是由n个整数组成的数列 a1, a2, a3, ..., an ,数与数之间由空格隔开。

第三行有m个整数k,数与数之间由空格隔开。

保证 0 < n ≤ 1 × 103; 0 < m ≤ 1 × 103;  − 1 × 103 ≤ a1, a2, a3, ..., an ≤ 1 × 103;  − 1 × 106 ≤ k ≤ 1 × 106;

Output

输出共包括m行,每行一个整数,表示数列中有多少个数比k大

Sample Input

5 5
1 2 3 4 5
3 5 4 6 -1

Sample Output

2
0
1
0
5

Hint

题目给的数据范围很小(-1000~1000),可以先统一映射到 0~2000,统计总数与前缀和
对于每个 k,超出范围可直接得结果,范围内就用总数减去前缀和。

代码实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <math.h>
#define ll long long

/*
题目给出的范围为-1000到1000,可将其映射到0到2000
1.当k+1000<0,说明所有数都比k大
2.当k+1000>2000,说明所有数都比k小
3.当0<=k+1000 && k+1000<=2000,sum-cnt[k]
sum: 存所有数总和n
cnt[k]: 存所有比k小的数
*/

const int Maxn = 2e3 + 10;
int a[Maxn], cnt[Maxn];
int sum, ans;

int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		memset(cnt, 0, sizeof(cnt));
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
			cnt[a[i] + 1000]++;
		}
		sum = n;
		for (int i = 1; i <= 2000; i++)
		{
			cnt[i] += cnt[i - 1];
		}
		for (int i = 0; i < m; i++)
		{
			int k;
			scanf("%d", &k);
			k += 1000;
			if (k < 0)ans = sum;
			else if (k > 2000)ans = 0;
			else ans = sum - cnt[k];
			printf("%d\n", ans);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值