0
点赞
收藏
分享

微信扫一扫

HDU2523 SORT AGAIN【水题】


SORT AGAIN




Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Total Submission(s): 4513    Accepted Submission(s): 1444



Problem Description


给你N个整数,x1,x2...xn,任取两个整数组合得到|xi-xj|,(0<i,j<=N,i!=j)。


现在请你计算第K大的组合数是哪个(一个组合数为第K大是指有K-1个不同的组合数小于它)。


 


Input


输入数据首先包含一个正整数C,表示包含C组测试用例.


每组测试数据的第一行包含两个整数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


 


Source


HDU 2008-10 Programming Contest


题目大意:给你N个数,找出这N个数中,两个数之间的差值的绝对值第K小的那两个数

的差的绝对值。

思路:因为数的范围是[0,2000],所以差的绝对值范围也是[0,2000]。用数组A[]存下N

个数。然后两重循环遍历这N个数,将差的绝对值作为下标,统计相同差的绝对值有多少

个,存入数组ab[]中。最后从前到后遍历一遍数组ab[],每找到差的绝对值不为0的ab[i],

就让K--。当K = 0,就找到了答案。



#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int A[1100],ab[2200];
int main()
{
int T;
cin >> T;
while(T--)
{
memset(ab,0,sizeof(ab));
int N,K;
cin >> N >> K;
for(int i = 0; i < N; ++i)
cin >> A[i];
for(int i = 0; i < N; ++i)
{
for(int j = i+1; j < N; ++j)
{
ab[abs(A[i]-A[j])]++;
}
}
for(int i = 0; i <= 2000; ++i)
{
if(ab[i])
K--;
if(K == 0)
{
cout << i << endl;
break;
}
}
}

return 0;
}



举报

相关推荐

0 条评论