有兩個長度為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...