说到只要知道前几大的数,我写了个代码:
#include <stdio.h>
typedef struct mlist
{
int n;
int flag;
}mlist;
int cnt_ml;
mlist ml[20];
void ml_push(int n)
{
ml[cnt_ml].n = n;
ml[cnt_ml].flag = 0;
cnt_ml++;
while (cnt_ml > 10)
{
int nmin = -1, n;
for (n=0; n<cnt_ml; n++)
{
if (ml[n].flag==0 && (nmin == -1 || ml[n].n<ml[nmin].n))
{
nmin = n;
}
}
ml[n=nmin].flag = 1;
while (nmin>0 && ml[nmin-1].flag)
{
nmin--;
}
while (n<cnt_ml && ml[n].flag)
{
n++;
}
if(nmin)++nmin;
for (; n<cnt_ml; ++n, ++nmin)
{
ml[nmin] = ml[n];
}
cnt_ml = nmin;
}
}
int main()
{
int n;
while (scanf("%d", &n)!=EOF)
{
int s, t=0;
cnt_ml = 0;
for (; t<n; ++t)
{
scanf("%d", &s);
ml_push(s);
}
for (t=0; t<cnt_ml; ++t)
{
if (ml[t].flag)
{
printf("_ ");
}
else
{
printf("%d ", ml[t].n);
}
}
puts("");
}
return 0;
}
例如,输入:
20
1 23 4 56 7 8 9 10 24 31 2 35 2 33 46 24 41 21 22 1
第一个数表示下一行要输入20个数,
然后程序会输出
56 _ 35 _ 33 46 _ 41 _
下横线表示中间有一串数字忽略掉
这样,就会保留下最大的五个数,并且复杂度是线性的,所用的内存空间也很小,只开了个20的数组
之后再套用那个二重循环的代码,就能以非常快的速度算出答案了
不过不知道这个代码是不是一定对的,但我觉得只要留下前五大就足够了,甚至可能只需要前四大的数,不知道有没有反例呢