这道题目没什么说的,刚开始快排超时了,后来就没有办法了。搜了一下才知道是hash,hash没怎么用过,记得这是第二次吧!记录一下!
简单分析下超时的原因:
本题的数据n最大的值为1000,如果取任意的两个数值进行绝对值计算,那么最多就会产生1000*1000/2个数据,大概就是500000个数据,下面又对这么的值进行排序,查找就超时了。
用hash的方法,压缩了数据量,因为任意两个1000以内的数据进行绝对值计算,范围一定在0-2000内,所以hash算法,大大的压缩要处理的数据量,提高了查找的效率。
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdio> 5 using namespace std; 6 int main() 7 { 8 int t; 9 int hash[2005]; 10 int num[1005]; 11 scanf("%d",&t); 12 while(t--) 13 { 14 int n,m; 15 scanf("%d%d",&n,&m); 16 memset(hash,0,sizeof(hash)); 17 memset(num,0,sizeof(num)); 18 int i,j; 19 for(i=0;i<n;i++) 20 { 21 22 scanf("%d",&num[i]); 23 } 24 for(i=0;i<n;i++) 25 for(j=i+1;j<n;j++) 26 { 27 int e=abs(num[i]-num[j]); 28 hash[e]=1; 29 30 } 31 for(i=0,j=0;i<=2000&&j<m;i++) 32 { 33 if(hash[i]==1) 34 { 35 j++; 36 } 37 } 38 printf("%d\n",i-1); 39 40 41 } 42 return 0; 43 }
Problem Description
给你N个整数,x1,x2...xn,任取两个整数组合得到|xi-xj|,(0<i,j<=N,i!=j)。
现在请你计算第K大的组合数是哪个(一个组合数为第K大是指有K-1个不同的组合数小于它)。
现在请你计算第K大的组合数是哪个(一个组合数为第K大是指有K-1个不同的组合数小于它)。
Input
输入数据首先包含一个正整数C,表示包含C组测试用例.
每组测试数据的第一行包含两个整数N,K。(1<N<=1000,0<K<=2000)
接下去一行包含N个整数,代表x1,x2..xn。(0<=xi<=2000)
每组测试数据的第一行包含两个整数N,K。(1<N<=1000,0<K<=2000)
接下去一行包含N个整数,代表x1,x2..xn。(0<=xi<=2000)
Output
对于每组测试数据,请输出第K大的组合数,每个输出实例占一行。
Sample Input
3
3 2
4 0 7
4 2
1 2 3 4
2 1
2 9
Sample Output
4
2
7