此题的意思比较好理解,给定一堆数,他们有着特定的值,从中选出总数量最大的一堆数,使得两两之间对应值的差小于等于m。
由于此题的数量级比较大,达到十万级,因此不能利用简单的二层循环来实现。而应当首先对数据按照特定值进行排序,然后i从1到n进行遍历,i<=j,若j-i<=m,则继续,直到得到j-i>m为止,此时应当注意,j不必回溯,而是从刚才的位置继续往后遍历。原因我相信并不难理解,虽然我当时没有想到囧。
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<math.h> using std::sort; long long number[100001]; int main() { int i,j,k,n,m,t,z; scanf("%d",&t); for(k=1;k<=t;k++) { long long max=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%lld",&number[i]); sort(number+1,number+1+n); for(i=1,z=i+1;i<=n;i++) { for(j=z;j<=n;j++) { if(number[j]-number[i]>m) { if(max<j-i) max=j-i; z=j; break; } } if(max<j-i) { max=j-i; z=j; } } printf("%lld\n",max); } return 0; }