TLE4个点,求如何优化

P1631 序列合并

```cpp for(register int i = 1; i <= n; i++) scanf("%d", &a[i]); for(register int i = 1; i <= n; i++) scanf("%d", &b[i]); for(register int i = 1; i <= n; i++){ for(register int j = 1; j <= n; j++){ if(q.size() < n) q.push(a[i] + b[j]); else{ if(q.top() > a[i] + b[j]) q.pop(), q.push(a[i] + b[j]); else break; } } } ``` 我的部分代码,参考一下? 不需要全部push进去,只要够了及时break就行
by szkzyc @ 2021-11-07 07:55:41


@[szkzyc](/user/402269) 谢谢
by Shiota_Kaede @ 2021-11-07 07:57:35


@[_JY_](/user/400269) 最后输出的时候记得用数组存全部元素再反向输出
by szkzyc @ 2021-11-07 08:06:47


@[szkzyc](/user/402269) 也就是用大根堆吗
by Shiota_Kaede @ 2021-11-07 08:08:11


@[_JY_](/user/400269) yes
by szkzyc @ 2021-11-07 08:11:34


你这第一个代码跟我开始写的一模一样 ``` #include<bits/stdc++.h> #include<queue> using namespace std; int n; int b[100000000]; inline int read(){//快读 int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } priority_queue<int,vector<int>,greater<int> > q; main(){ n=read(); for(int i=1;i<=n;i++) b[i]=read(); for(int i=1;i<=n;i++){ int a=read(); for(int j=1;j<=n;j++){ q.push(a+b[j]); } } for(int i=1;i<=n;i++){ cout<<q.top()<<" "; q.pop(); } } ``` 这是我最开始写的
by 1711Elegy @ 2023-05-21 17:05:39


哦,写出来了 数据大了之后不用全放进去(受了点小启发) ``` #include<bits/stdc++.h> #include<queue> using namespace std; int n; int a[100000000],b[100000000]; inline int read(){//快读 int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } priority_queue<int,vector<int>,greater<int> > q;//小更堆 main(){ n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); if(n>2000){//数据太大就不全放进去 for(int i=1;i<n/35;i++){ for(int j=1;j<=n/35;j++){ q.push(a[i]+b[j]); } } } else{//数据小一点,就全放进去算了 for(int i=1;i<n;i++){ for(int j=1;j<=n;j++){ q.push(a[i]+b[j]); } } } for(int i=1;i<=n;i++){ printf("%d ",q.top()); q.pop(); } } ``` 然后就过了
by 1711Elegy @ 2023-05-21 17:28:47


|