钻石收集者

Diamond Collector钻石收集
[命题人 : 外部导入]
时间限制 : 10.000 sec  内存限制 : 128 MB

题目描述
贝西是一只牛,她喜欢闪闪发光的东西,于是有在空闲时间里挖钻石的爱好。她收集了N颗不同大小的钻石(N<=10
00),她想在牛棚的展示箱里放一些钻石。因为贝西希望展示在箱子里的钻石大小尽量相似,她决定不会把两颗大
小相差超过K的钻石一起放进箱子里(如果两颗钻石的大小恰好相差K那它们也能一起在箱子里展示)。给出K,请
帮助贝西求出她能展示在箱子里的钻石数量的最大值。
输入
输入的第一行包含N和K(0<=K<=10,000)。
接下来的N行每行包含一个整数表示其中一颗钻石的大小。所有的大小都是正数且不超过10,000
输出
输出一个正整数,表示贝西能展示的钻石数量的最大值
样例输入 Copy
5 3
1
6
4
3
1
样例输出 Copy
4

  

最暴力的

#include <cstdio>
#include <algorithm>
#define max(x,y) x>y?x:y
using namespace std;
int a[1001],n,k;
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
	    scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    int tot=0;
    for(int i=1;i<=n;i++) 
    //枚举最小的钻石 
	{
            int ans=1;
            for(int j=i+1;j<=n;j++)
			{
                if(a[j]-a[i]>k)
				    break;
                ans++;
            }
            tot=max(tot,ans);
        }
    printf("%d",tot);
}

  

针对体积来考虑,因为体积<=10000

//by myx 
#include<bits/stdc++.h>
using namespace std;
int book[20001]; //这个要开到20000
int main() {
	int n, k;
	cin >> n >> k;
	memset(book,0,sizeof(book));
	for (int i = 1; i <= n; i++) 
	{
		int a;
		cin >> a;
		book[a]++;
		//统计体积为a的钻石有多少个 
	}
	int maxx = 1;
	for (int i = 1; i <= 10001; i++) 
	//枚举最小的钻石 
	{
		int b=0;
		for(int j=i;j<=k+i;j++)
		//统计从[i,i+k]这一段有多少个钻石 
			b+=book[j];
		if (b > maxx)
			maxx = b;
	}
	cout << maxx << endl;
	return 0;
}

  前缀和优化下

#include<bits/stdc++.h>
using namespace std;
int book[20001]; //这个要开到20000
int sum[20000];
int main() {
    int n, k;
    cin >> n >> k;
    memset(book,0,sizeof(book));
    for (int i = 1; i <= n; i++)
    {
        int a;
        cin >> a;
        book[a]++;
        
        //统计体积为a的钻石有多少个
    }
    for (int i=1;i<=10000;i++)
        sum[i]=sum[i-1]+book[i];
    int maxx = 1;
    for (int i = 0; i <= 10000; i++)
    if (i>=k+1)
    
        if (sum[i]-sum[i-k-1] > maxx)
            maxx = sum[i]-sum[i-k-1];
    
    cout << maxx << endl;
    return 0;
}

  

  利用单调队列来做

#include<bits/stdc++.h>
using namespace std;
int a[501000];
int main()
{
    int n,k,ans;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    sort(a+1,a+n+1);
    int head=1,tail=1;
    ans=1;
    while(tail<n)
    {
        
        tail++;
        while(a[tail]-a[head]>k)
             head++;
        if(tail-head+1>ans)
           ans=tail-head+1;
    }
    cout<<ans<<endl;
    return 0;
}

  

 

  

原文地址:https://www.cnblogs.com/cutemush/p/14671322.html