现在的位置: 首页 > 综合 > 正文

一定要用数组标记|xi-xj|,不然会超时

2018年02月22日 ⁄ 综合 ⁄ 共 847字 ⁄ 字号 评论关闭
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
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 1000010
int cmp(int a,int b){return a<b;}
int t,n,k,x[N],sub[N],sn,vist[2009],vv[2009];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        for(int i=0;i<=2000;i++)
        vist[i]=vv[i]=0;
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
        scanf("%d",&x[i]);
        sort(x,x+n,cmp);
        sn=0;
        for(int i=0;i<n;i++)
        if(vist[x[i]]==0)
        {
            vist[x[i]]=1;
            for(int j=i+1;j<n;j++)
            if(vv[x[j]-x[i]]==0)
            {
                sub[sn++]=x[j]-x[i];
                vv[sub[sn-1]]=1;//不加这个条件就会超时
            }
        }
        sort(sub,sub+sn,cmp);
        sn=unique(sub,sub+sn)-sub;
        printf("%d\n",sub[k-1]);
    }
}

抱歉!评论已关闭.