本文主要是介绍一定要用数组标记|xi-xj|,不然会超时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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#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]);} }
这篇关于一定要用数组标记|xi-xj|,不然会超时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!