http://acm.hdu.edu.cn/showproblem.php?pid=2523
SORT AGAIN
Time Limit: 2000/1000 MS (Java/Others)Total Submission(s): 1805
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
Source
Recommend
gaojie
这题刚刚上手的时候想得比较简单:用数组ans记录所有的|xi-xj|,排序后删除重复数字,输出ans[k]即可。我写好了代码,一直显示running time error实在是百思不得其解。望大牛帮忙看看,指点一下,拜托了!
代码如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int num[2050],ans[2050];//num用来记录数据 ans用来记录|xi-xj|
void de(int *a,int l)//这是我写的删除重复数字的函数,*a是数组首地址,l是数组长度。数组已经排序好
{
int i,j,k=1;
for(i=0;i<l;i++)
for(j=i+1;j<l;j++)
{
if(a[j]!=a[i])
{
a[k++]=a[j];
i=j;
}
}
}
int abs(int x)
{
return x>=0?x:-x;
}
int main()
{
int T,i,j,p,n,k,l;
scanf("%d",&T);
while(T--)
{
memset(num,0,sizeof(num));
memset(ans,0,sizeof(ans));
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
//读入数据
scanf("%d",&num[i]);
p=0;
//p用来计算ans数组长度
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
ans[p++]=abs(num[i]-num[j]);//i,j循环可以涵盖所有的xi-xj情况
}
sort(ans,ans+p);
//排序,为de函数做准备
de(ans,p);
//删除重复数字
//for(i=0;i<p;i++)
//printf("%d ",ans[i]);
//printf("\n");
printf("%d\n",ans[k-1]);
//输出第k大的数字
}
return 0;
}
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int num[2050],ans[2050];//num用来记录数据
void de(int *a,int l)//这是我写的删除重复数字的函数,*a是数组首地址,l是数组长度。数组已经排序好
{
}
int abs(int x)
{
}
int main()
{
}
实在没有办法,只好用哈希了,终于AC ^-^
代码如下:
#include<stdio.h>
#include<string.h>
int num[2050],ans[2050];
int abs(int x)
{
return x>=0?x:-x;
}
int main()
{
int T,i,j,k,l,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
memset(ans,0,sizeof(ans));
for(i=0;i<n;i++)
scanf("%d",&num[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
ans[abs(num[i]-num[j])]=1;
l=0;
for(i=0;i<2050;i++)
{
l+=ans[i];
if(l==k)
break;
}
#include<string.h>
int num[2050],ans[2050];
int abs(int x)
{
}
int main()
{
}