[Structure de données·Tas] Les n premiers petits éléments de la somme de la séquence (tri par tas)

description du sujet

Question : Les n premiers petits éléments de la somme de la séquence
Étant donné deux listes ordonnées A et B de longueur n, une de chacune de A et B est choisie au hasard, et n^2 sommes peuvent être obtenues. Trouvez la plus petite n de ces sommes.

format d'entrée et de sortie

Format d'entrée :

Il y a trois lignes de données d'entrée.
  Sur la première ligne, une valeur entière n ( n <= 10^4 ).
  Les deuxième et troisième lignes ont chacune n entiers triés de petit à grand, et il y a un espace entre chaque entier. (tout entier inférieur à 2^30)

Format de sortie:

Sortez une ligne de données, ces derniers et les n plus petits nombres, sortie de petit à grand, avec un espace entre chaque entier.

Échantillons d'entrée et de sortie

Exemple d'entrée #1 :

3
2 6 6
1 4 8

Exemple de sortie #1 :

3 6 7

train de pensée

Quand j'ai vu cette question pour la première fois, je pensais que c'était une question d'eau , non, c'était juste n 2 n ^ 2n2 numéros triés puis sortis ? Du coup, il a fallu deux minutes pour écrire le code puis directementTLE...
Ensuite j'ai écouté le commentaire du professeur et j'ai constaté qu'il s'agissait bien d'unproblème d'eau
. L'idée est probablement :
1. Construire ungros tas racine(priorité queue) pour maintenirla somme dutableau aetdu tableau b
! ! ! C'est un gros tas de racines, pas un petit tas de racines ! ! ! Qu'il soit trié du plus petit au plus grand, le petit tas racine est construitcar le haut du gros tas racine est le plus grand, ce qui équivaut à un gardien de but.Tous les numéros doivent le traverser s'ils veulent entrer dans le tas. Nous pouvons utiliser ce haut de la pile pour filtrer tous les nombres.
2.La violenceà double cycleénumère latableau aetdu tableau b,mais ! ! ! La taille est possible ici ! ! ! Étant donné que l'entrée est constituée de deuxlistes ordonnées, tant que l'une desajoutéesest supérieure au sommet du grand tas racine, la sommeajoutéesera supérieure au sommet du grand tas racine et il est impossible d'entrer la pile. Il suffit donc de casser directement3.Metteztableau aetdu tableau bplus petit que le hautdu tas dans le tas4. À ce moment, nous pouvons obtenir une file d'attente de grande à petite (gros tas), et enfin la renverser vers le bas et le sortir

AC la

Si vous ne le comprenez pas, jetez un œil au code et aux commentaires :

Code CA

#include<bits/stdc++.h>
using namespace std;
int n,t,a[100001],ans,b[100001],c[100001];
map<int,int> p;
priority_queue <int,vector<int>,less<int> > q;//从大到小 
//priority_queue <int,vector<int>,greater<int> > q1;//从小到大 
int main(){
    
    
	cin>>n;
	for(int i=1;i<=n;i++){
    
    //输入 
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
    
    //先将a[1]+b[1...n]放入队列 
		cin>>b[i];
		q.push(a[1]+b[i]);
	}
	for(int i=2;i<=n;i++){
    
    //枚举 
		for(int j=1;j<=n;j++){
    
    
			if(a[i]+b[j]>q.top()) break;
			//由于b是一个有序表,所以如果当前这个都大了那么后面的会更大 ,所以可以直接break 
			q.pop();//弹出最大的 
			q.push(a[i]+b[j]);//放入新的数 
		}
	}
	//这时得到了一个大顶堆,我不知道怎样倒过来,所以用了最笨的方法,如果有更好的方法欢迎评论区讨论哦
	int i=0;
	while(!q.empty()){
    
    //倒过来
		i++;
		c[i]=q.top();
		q.pop();
	}
	for(int j=i;j>=1;j--) cout<<c[j]<<" ";//输出
	return 0;
}

Cette question est terminée comme ça, pensez à la soutenir trois fois de suite QAQ

Je suppose que tu aimes

Origine blog.csdn.net/m0_61360607/article/details/132168300
conseillé
Classement