这三题都是查找前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; }