布展(show) 时间限制: 1 Sec 内存限制: 128 MB

布展(show) 时间限制: 1 Sec 内存限制: 128 MB
题目描述

有N颗宝石, 安排在一个展示柜展览。 为了展出的视觉效果, 希望参与展示的宝石直径差距不要超过K个单位,也就是说直径差距超过K的宝石不能同时展出。 问最多可以选择多少颗宝石布展。

输入

第一行两个整数 N 和 K, 意义如题目所述。

之后 N 行, 每行一个数 D, 表示宝石的直径。

数据范围

N<=200,000

K<=1,000,000,000

D<=1,000,000,000

输出

一个正整数, 表示最多可以展示的数量。

样例输入 Copy

7 3

10

5

1

12

9

5

14

样例输出Copy

3

/*题目描述

有N颗宝石, 安排在一个展示柜展览。 为了展出的视觉效果, 希望参与展示的宝石直径差距不要超过K个单位,也就是说直径差距超过K的宝石不能同时展出。 问最多可以选择多少颗宝石布展。

输入

第一行两个整数 N 和 K, 意义如题目所述。

之后 N 行, 每行一个数 D, 表示宝石的直径。*/
#include
using namespace std;
long const N = 100000000;
int a[N], tmp[N], n, k;
void Merge(int a[], int s, int m, int e, int tmp[])
{ // 将数组a a 的局部 a[s,m] 和 a[m+1,e] 合并到 tmp, 并保证 tmp 有序,然后再拷贝回 a[s,m]
// 归并操作时间复杂度: o(e e- - m+1), 即o( n)
	int pb = 0;
	int p1 = s, p2 = m + 1;
	while (p1 <= m && p2 <= e) {
		if (a[p1] < a[p2])
			tmp[pb++] = a[p1++];
		else
			tmp[pb++] = a[p2++];
	}
	while (p1 <= m)
		tmp[pb++] = a[p1++];
	while (p2 <= e)
		tmp[pb++] = a[p2++];
	for (int i = 0;i < e - s + 1; ++i)
		a[s + i] = tmp[i];
}
void MergeSort(int a[], int s, int e, int tmp[]) {
	if (s < e) {
		int m = s + (e - s) / 2;
		MergeSort(a, s, m, tmp);
		MergeSort(a, m + 1, e, tmp);
		Merge(a, s, m, e, tmp);
	}
}
int main() {
	int  max = 0;
	cin >> n >> k;
	for (int i = 0;i < n;++i) //录入每颗宝石直径
		cin >> a[i];
	MergeSort(a, 0, n - 1, tmp); //利用临时数组进行归并排序
	for (int i = 0;i < n;++i) {
		tmp[i] = 1;   //临时数组再利用来记录每个宝石能与其它宝石摆放的最多颗数;
	}
	for (int i = 0;i < n-1;++i) { 
		for (int j = i+1;j < n;++j) {
			if((a[j] - a[i]) <= k) { 
				tmp[i]++; //搜索符合并列摆放的宝石并记录;
			}
			else break;
		}
	}
	for (int i = 0;i < n;++i) {
		if (max < tmp[i])max = tmp[i]; 
	}
	cout << max;  //将最大数输出;
}

你可能感兴趣的:(解问答)