HDU2523 SORT AGAIN【水题】

来源:互联网 发布:路由器封端口 编辑:程序博客网 时间:2024/04/27 16:31
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 0