其实是一道很简单的排序题,但是一直错。
最后终于找到了原因。 qsort中 comp 的错误使用导致,运行程序是输入数据总能得到正确答案,但是就是过不了OJ。
int comp1(const void *a,const void *b)
{
ele *c = (ele *)a; ele *d = (ele *)b;
if(c->mark == d->mark) return c->index < d->index?0:1;
else return c->mark > d->mark ? 0:1;
}
int comp2(const void *a,const void *b)
{
ele *c = (ele *)a; ele *d = (ele *)b;
return c->index > d->index ? 0:1;
}
这是我最初使用的comp,最后发现 qsort 和 sort 不同,应该使用‘ - ’ 而不是 ‘ >’ ' < '。
以下为正确代码。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
typedef struct ele
{
int index;
double mark;
} ele;
ele a[10003];
int comp1(const void *a,const void *b)
{
ele *c = (ele *)a; ele *d = (ele *)b;
if(c->mark == d->mark) return c->index - d->index;
else return d->mark - c->mark;
}
int comp2(const void *a,const void *b)
{
ele *c = (ele *)a; ele *d = (ele *)b;
return d->index - c->index ;
}
int main()
{
int n,m,k,i,j;
double temp;
while(~scanf("%d%d%d",&n,&m,&k))
{
for(i=0;i<10000;i++)
a[i].mark=0;
memset(a,0,sizeof(a));
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
scanf("%lf",&temp);
a[j].mark += temp;
a[j].index = j;
}
}
qsort(a+1,m,sizeof(a[0]),comp1);
qsort(a+1,k,sizeof(a[0]),comp2);
for(i = 1; i < k; i++)
{
printf("%d ",a[i].index);
}
printf("%d\n",a[k].index);
}
return 0;
}