这三题都是查找前m大数。所以,贴在一起,有个比较。
1425和1280的主要思想是一样的:空间换时间。但并不是每一道排序题都可以这样做,有条件限制才可以,什么条件呢?1425的条件是:每个整数范围[-500000,
500000]。1280的条件是:每个正整数不大于5000,所以两数相加范围为[2,10000]。这样就可以用一个辅助数组来记录了,详见代码。但3785就不可以,必须排序。
因为题目不能提炼出前两题的限制条件。
1425代码:
这题还要注意的是:
①所要的整型数组空间较大,不能直接放到main()内申请。定义全局变量。因为,函数内变量放在栈中,大了就会stake_overflow了,全局变量放在堆中,可以申请较
大空间。
②最好用C中输入输出scanf、printf,用cin、cout超时了。
#include <iostream>
using namespace std;
int b[1000001];
int main()
{
int tem,i,n,m;
while(cin>>n>>m)
{
memset(b,0,sizeof(b));
for(i=0;i<n;i++)
{
//cin>>tem;
scanf("%d",&tem);
b[500000+tem]=1;
}
for(i=1000000;m>=1;i--)
{
if(b[i]==1)
{
//cout<<i-500000;
printf("%d",i-500000);
if(m>1)
//cout<<" ";
putchar(32);
else
//cout<<endl;
putchar(10);
m--;
}
}
}
return 0;
}
1280代码:
#include<iostream>
using namespace std;
int main()
{
int a[3000],count[10001];
bool b[10001];
int i,j,m,n;
while(cin>>m>>n)
{
for(i=0;i<m;i++)
cin>>a[i];
memset(b,0,sizeof(b));
memset(count,0,sizeof(count));
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
b[a[i]+a[j]]=1;
count[a[i]+a[j]]++;
}
}
for(i=10000;n>=1;i--)
{
if(b[i]==1)
{
while(count[i]--)
{
cout<<i;
if(n>1)
cout<<" ";
else
cout<<endl;
n--;
if(n<1)
break;
}
}
}
}
return 0;
}
3785代码:
#include<iostream>
using namespace std;
void shell_sort(int a[],int m) //希尔排序,递增
{
int i,j,len,tem;
len=m/2;
while(len>=1)
{
for(i=len;i<m;i++)
{
tem=a[i];
j=i-len;
while(j>=len-1 && a[j]<tem) //<或>,都是在满足条件下为tem向前找位置
{
a[j+len]=a[j];
j-=len;
}
a[j+len]=tem;
}
len/=2;
}
}
int main()
{
int m,n,i;
int a[100000];
while(cin>>m>>n,m||n)
{
for(i=0;i<m;i++)
cin>>a[i];
shell_sort(a,m);
n=(m>n)?n:m;
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
return 0;
}