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;
}