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