HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)

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

题意很简单~

就是求第k个组合数(组合数从小到打排序,重复的数只算一次)

容易知道,n个数的组合数最多有n*(n-1)/2个,可能有重复的,把这个n*(n-1)/2个组合数用数组存储起来,按从小到大排序,再从小到大找出第k个不重复的数!!!


import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t =sc.nextInt();

        while(t-->0){
            int n =sc.nextInt();
            int k=sc.nextInt();
            int a[] = new int[n];
            for(int i=0;i<n;i++){
                a[i]=sc.nextInt();
            }
            Arrays.sort(a);
            int b[] = new int[n*(n-1)/2];
            int h=0;
            for(int i=0;i<n-1;i++){
                for(int j=i+1;j<n;j++){
                    b[h]=Math.abs((a[i]-a[j]));
                    h++;
                }
            }

            Arrays.sort(b);
            h=0;
            for(int i=0;i<b.length-1;i++){
                if(b[i]!=b[i+1]){
                    h++;
                    if(h==k){
                        h=i;
                        break;
                    }
                }
            }
            System.out.println(b[h]);
        }
    }
}
时间: 2024-10-23 23:55:29

HDOJ(HDU) 2523 SORT AGAIN(推导排序、、)的相关文章

HDU 1425 sort 题解

选择出数列中前k个最大的数. 这里因为数据特殊,所以可以使用hash表的方法: #include <cstdio> #include <algorithm> #include <stdlib.h> #include <limits> using namespace std; const int SIZE = 1000005; const int SMALL = -500000; bool arr[SIZE]; int main() { int n, m, a

C#中List调用库函数sort进行升序排序

private void button1_Click(object sender, EventArgs e) { List<int> demo2 = new List<int>(); demo2.Add(1); demo2.Add(56); demo2.Add(34); demo2.Add(4); demo2.Add(5); demo2.Add(6); int[] demo3=demo2.ToArray();//z重点是将list转换为arry类型.然后调用arry的sort函数进

C++: quick sort(快排序)

到目前为止, 我们已经学习到了插入排序, 冒泡排序, 选择排序(selection). 这些排序算法都是comparision based sorting algorithms(即涉及到元素大小的比较来决定元素的先后顺序). 而且算法的时间复杂度上均为O(n^2).但是comparision based 的排序算法远非这几个算法. 而且可以通过利用其它的一些手段(例如divide and conquer technique, 分治法)实现对基于比较的排序算法的时间复杂度降低到O(nlogn).

HDOJ/HDU 2140 Michael Scofield&#39;s letter(字符转换~)

Problem Description I believe many people are the fans of prison break. How clever Michael is!! In order that the message won't be found by FBI easily, he usually send code letters to Sara by a paper crane. Hence, the paper crane is Michael in the he

HDU 2689 Sort it (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2689 Sort it Problem Description You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it 

hdu 4857 逃生 (拓扑排序+保证最小在前面)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 74    Accepted Submission(s): 13 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前. 同时,社会是不平

利用标准库中sort函数进行排序

//1.利用sort进行由小到大排序: #include<stdio.h> #include<algorithm> using namespace std; int main() { int a[10],i; for (i=0;i<10;i++) scanf("%d",&a[i]); sort(a,a+10); for (i=0;i<10;i++)printf("%d ",a[i]); return 0; } //2.利用

HDOJ/HDU 1161 Eddy&#39;s mistakes(大写字母转换成小写字母)

Problem Description Eddy usually writes articles ,but he likes mixing the English letter uses, for example "computer science" is written frequently "coMpUtEr scIeNce" by him, this mistakes lets Eddy's English teacher be extremely disco

HDOJ/HDU 1250 Hat&#39;s Fibonacci(大数~斐波拉契)

Problem Description A Fibonacci sequence is calculated by adding the previous two members the sequence, with the first two members being both 1. F(1) = 1, F(2) = 1, F(3) = 1,F(4) = 1, F(n>4) = F(n - 1) + F(n-2) + F(n-3) + F(n-4) Your task is to take