SORT AGAIN
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8831 Accepted Submission(s): 2803
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 Input33 24 0 74 21 2 3 42 12 9Sample Output427
题解:
1.设两个数组 一个数组存放输入的N个数字 另一个数组存放他们的差值
2.把所有数字都两两进行比较并把差值存在数组里面 可以在差值对应的位置存放差值 这样方便之后的输出 即b[m]=m,这样也可以有效考虑到出现差值相等的情况
3.对b数组从小到大进行循环 找到第K个存放过数字的地方并输出
本题需要注意的两个地方:
1.题目所说的第K大,其实是日常习惯中所说的第K小,一定要仔细读题!!!题目里还特意解释了第K大,而给的示例输入输出又很刚好地使得两个理解方式答案一样 埋下了一个坑 一定要仔细读题啊!!<敲黑板>
2.输入的N个数里面有可能存在相等的情况 所以使用memset的时候把它们全都置-1(这里再强调一下:memset只能置-1或者0)
ac代码:
#include<iostream>
#include<cstring>
#include<cmath>
int main()
{
using namespace std;
int C;
int N,K,m;
int a[1005],b[2005];//a存储输入的数字,b存储差值
cin>>C;
while(C--)
{
cin>>N>>K;//这里每次都顺手地打成cin>>N,K;然后找半天错误 气死了 为什么编译也不提示错误
memset(b,-1,sizeof(b));
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++)
{
m=abs(a[i]-a[j]);
b[m]=m;
}
}
int count=0;
for(int i=0;i<2005;i++)
{
if(b[i]==-1)
continue;
else
count++;
if(count==K)
{
cout<<b[i]<<endl;
break;
}
}
}
return 0;
}