问题很简单,在一条直线上,坐标从0开始到1000000;现在有n个石子在这条直线上(同一个位置可能有多个石子)
那么用一个定长为m的杆子去覆盖,请问最多能覆盖多少个石子?
3 2 0 0 1 5 2 0 1 2 4 5
3 3
#include<string.h>
#include<stdio.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
int num[50005],sum[50005],minn,maxn;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
memset(num,0,sizeof(num));
memset(sum,0,sizeof(sum));
maxn=-1;
minn=50005;
for(i=0;i<n;i++)
{
int a;
scanf("%d",&a);
minn=min(a,minn);
maxn=max(a,maxn);
num[a]++;
}
sum[minn]=num[minn];
for(i=minn+1;i<=maxn;i++)
{
sum[i]=sum[i-1]+num[i];
}
int ans=-1;
if(maxn-minn<m)
ans=sum[maxn];
for(i=minn+m;i<=maxn;i++)
{
int temp=sum[i]-sum[i-m-1];
if(temp>ans)
ans=temp;
}
printf("%d\n",ans);
}
}原文:http://blog.csdn.net/yu_ch_sh/article/details/44275985