定长覆盖
时间限制:2000 ms | 内存限制:65535 KB
难度:2
- 描述
-
问题很简单,在一条直线上,坐标从0开始到1000000;现在有n个石子在这条直线上(同一个位置可能有多个石子)那么用一个定长为m的杆子去覆盖,请问最多能覆盖多少个石子?
- 输入
- 输入有多组数据
第一行有2个整数,n 和 m(n <= 50000,0 < m <= 1000)
第二行有n个整数代表每个石子的位置(所有的数小于50000)
- 输出
- 每种情况输出一个整数(最多能覆盖的石子数)
- 样例输入
-
3 2 0 0 1 5 2 0 1 2 4 5
- 样例输出
-
3 3
- 来源
- 刘成
- 上传者
- 刘成
ac代码
#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); } }
时间: 2024-07-29 12:13:28