這三題都是尋找前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<<" ";elsecout<<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;}