题目描述:给你n个数 让你两两求和并且输出前m大的数
N<=3000,a[i]<=5000
分析:一开始我是把全部都存起来排个序,然后超内存了,因为空间复杂度为O(n*n) ,第一次接触到空间复杂度的题 ,后来改为存数据大小了(小于等于10000)
#include<bits/stdc++.h> #define pb(x) push_back(x) #define sz(x) size(x) #define ey(x) empty(x) #define pp() pop(x) #define cr(x) clear(x) #define p(x) push(x) #define t(x) top(x) #define f(x) front(x) #define FOR(i,j,n) for(int i=j;i<n;i++) #define FOR1(i,j,n,a) for(int i=j;i<n;i++)cin>>a[i] #define mp(x,y) make_pair(x,y) #define ms(a,x) memset(a,x,sizeof(a)) using namespace std; int main(){ ios::sync_with_stdio(0); cin.tie(0); int n,m,flag; while(cin>>n>>m){ flag=0; int a[3003]; int vis[10004]; ms(vis,0); FOR1(i,0,n,a); FOR(i,0,n)FOR(j,i+1,n) vis[a[i]+a[j]]++; int cnt=0; for(int i=10000;i>=0;i--){ if(flag)break; while(vis[i]!=0){ cout<<i; vis[i]--; cnt++; if(cnt!=m)cout<<' '; else {cout<<endl;flag=1;break;} } } } }