zzuliOJ 2269 minval 優先佇列

2021-08-19 09:05:29 字數 2135 閱讀 4502

有兩個長度為n的序列a和b,在a和b中各任取乙個數相加可以得到 n

2n^2

n2個和,求這n2個和中最小的n個。

第一行輸入乙個正整數n(1<=n<=100000);

第二行n個整數ai且 a

i<=1

09

ai<=10^

ai<=1

09;第三行n個整數bi且 b

i<=1

09

bi<=10^

bi<=1

09。輸出僅一行,包含n個整數,從小到大輸出這n個最小的和,相鄰數字之間用空格隔開。

51 3 2 4 5

6 3 4 1 7

2 3 4 4 5

這道題目直接暴力求出n*n個結果然後排序不用想肯定是超時的,所以就需要在這個基礎上進行一些優化,把a,b兩個數列先按照公升序排序,然後用乙個降序優先佇列儲存相加結果,不斷維護這個優先佇列。先把a數列第乙個數和b數列所有數之和新增進優先佇列,之後從a數列第二個數開始繼續列舉和b數列各個數之和,若和大於優先佇列隊首則跳出迴圈,進行a數列下乙個數的列舉,否則就將和新增進佇列,並將隊首元素pop出來,若列舉到的a數列元素與b數列第乙個元素之和大於優先佇列隊首元素則直接跳出所有列舉。最後按照題目要求輸出結果。

當時在比賽的時候因為這題目「執行錯誤」卡了很長時間也沒有做出來,之後發現是因為使用cin&&cout進行資料輸入輸出時用

ios::

sync_with_stdio(0

);cin.

tie(0)

;

關閉了同步流導致,把這兩行**注釋掉或者將cin&&cout換為scanf&&printf就可以ac。找到原因的我感覺一臉矇逼,完全不知道為什麼會出現這樣的「玄學」錯誤。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define mem(a,b) memset(a,b,sizeof(a))

#define pb push_back

typedef

long

long ll;

typedef pair<

int,

int> p;

const

int inf =

0x3f3f3f3f

;const

int maxn =

1e5+5;

const

double eps =

1e-5

;const

double pi =

asin

(1.0)*

2;const

double e =

2.718281828459

;int n;

int a[maxn]

, b[maxn]

;priority_queue<

int> que;

void

output_res()

else

}int

main()

sort

(a +

1, a + n +1)

;for

(int i =

1; i <= n;

++i)

sort

(b +

1, b + n +1)

;for

(int i =

2; i <= n;

++i)

for(

int j =

1; j <= n;

++j)

que.

push

(a[i]

+ b[j]);

que.

pop();

}}output_res()

;return0;

}

2 26 演算法練習

時間限制 1.0s 記憶體限制 512.0mb 給定兩個僅由大寫字母或小寫字母組成的字串 長度介於1到10之間 它們之間的關係是以下4中情況之一 1 兩個字串長度不等。比如 beijing 和 hebei 2 兩個字串不僅長度相等,而且相應位置上的字元完全一致 區分大小寫 比如 beijing 和 ...

日思清單2 26

訂閱李笑來 通往財富自由之路 這個專欄已經差不多半年了,這半年的心態從 一定要公升級我的作業系統 到 其實等過幾天看 只是把3分鐘熱度延長了而已。由於大部分人都不是含著 密鑰匙 出生,中國也一直都有 望子成龍 或 望女成鳳 的傳統,所以可以假定我們每個人都希望出人頭地,你還可以想象大家一般還會說 等...

藍橋杯練習 2 26

字串對比 思路 此題主要考察c 中字串的一些應用 c 中可以直接定義乙個空字串,然後直接讀入 string s1 cin s1 也可以用getline 讀入 接受乙個字串,可以接收空格並輸出 string str getline cin,str 都需包含 include 獲得字串長度len s1.s...