第一次專題hdu 1280 前m大的數 hash
阿新 • • 發佈:2019-01-06
//sort方法時間超限 /*#include<cstdio> #include<algorithm> #include<iostream> using namespace std; int dig[3005],sum[44853]; int com(int a,int b) { return a>b; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%d",&dig[i]); } int coun=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ sum[coun++]=dig[i]+dig[j]; } } sort(sum,sum+n*(n-1)/2,com); for(int i=0;i<m;i++) { printf("%d ",sum[i]); } printf("\n"); } return 0; }*/ //這份程式碼是用hash做的,規則定義的兩個值相加 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> using namespace std; int dig[3005]; //int has[100006]; int has[5000003]; //sum[44853]; //註釋掉的程式碼是和快排不一樣的部分 //空間換了時間 int main() { int n,m; memset(has,0,sizeof(has));//注意不要用hash,否則評測機會給顯示編譯錯誤,顯示的是結構體 while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%d",&dig[i]); } //int coun=0; int maxx=-1; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ //sum[coun++]=dig[i]+dig[j]; has[dig[i]+dig[j]]++; maxx=max(maxx,dig[i]+dig[j]); } } //sort(hash,sum+n*(n-1)/2,com); int i=maxx,k=m; while(k){ if(has[i]--){ if(k<m) printf(" ");//這裡一開始出現格式錯誤,注意一下 printf("%d",i); k--; } else i--; } printf("\n"); } return 0; }