布展(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<iostream>
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;  //將最大數輸出;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章