原题
我突发奇想,能不能不用优先队列,每次枚举可能作为答案的数的范围,把所有可能产生的数全塞到数组里,排序后取前 n 个,为什么WA了awa
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2005,M=1005;
ll a[M][N],tmp[N*2],top;
void solve(){
ll n,m;
scanf("%lld%lld",&m,&n);
for(ll i=1;i<=m;i++){
for(ll j=1;j<=n;j++)
scanf("%lld",&a[i][j]);
sort(&a[i][0],&a[i][n+1]);
}
for(ll i=2;i<=m;i++){
ll t1=1,t2=1;
while(t1*t2<n){
if(t1==n) t2++;
else if(t2==n) t1++;
else if(a[i-1][t1]+a[i][t2+1] <= a[i-1][t1+1]+a[i][t2]) t2++;
else t1++;
}
top=0;
for(ll j=1;j<=t1;j++){
for(ll k=1;k<=t2;k++){
tmp[++top]=a[i-1][j]+a[i][k];
}
}
sort(tmp+1,tmp+top+1);
for(ll j=1;j<=n;j++) a[i][j] = tmp[j];
}
for(ll i=1;i<=n;i++) printf("%lld ",a[m][i]);
printf("\n");
}
int main(){
ll T;
scanf("%lld",&T);
while(T--) solve();
return 0;
}