站外题悬关求助
  • 板块学术版
  • 楼主pineappler
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/7/21 14:32
  • 上次更新2025/7/21 18:57:45
查看原帖
站外题悬关求助
995117
pineappler楼主2025/7/21 14:32

原题
我突发奇想,能不能不用优先队列,每次枚举可能作为答案的数的范围,把所有可能产生的数全塞到数组里,排序后取前 nn 个,为什么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;
}
2025/7/21 14:32
加载中...