p1631 序列合併
首先,對於最暴力的演算法。就是將n^2個和全都列舉出來。然後排序
可是,在資料範圍很大的時候,空間和時間都不能通過
所以我們就要優化~~ 廢話~~
首先我們的貪心策略不會變。優化的只能是列舉和的步驟
我們來看,對於a中的第i項和b中的第j項(a、b都是公升序)
只有第i項和第j-1項被取了之後,我們才有可能取到第i項和第j項
所以我們就可以將計算第i項和第j項的和推遲在第i項和第j-1項之後。就可以節省空間。
然後用棧進行維護
寫程式的時候。我們要進行定序處理。
嗯,差不多就這麼多了。
#include#include#includeusing namespace std;
struct node
//過載運算子
};struct heap//堆模板
void swap(int a,int b)
void insert(node value)
return ;
} void del()
return ;
}};
int dat1[500000];
int dat2[500000];
heap h;
bool compare(const int &a,const int &b)
int main()
int get=0;
while(getreturn 0;
}
P1631 序列合併
做法 將 a 和 b 都從小到大排一遍序。然後組成這樣乙個矩陣 a1 b1 a1 b2 a1 b3 a1 bn a2 b1 a2 b2 a2 b3 a2 bn a3 b1 an b1 an b2 an b3 an bn 正確性 我們先把每行的頭扔進堆裡,每行的頭是每行中的最小值,所以這樣我們能在堆裡...
P1631 序列合併
有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到n 2個和,求這n 2個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數ai,滿足ai ai 1且ai 10 9 第三行n個整數bi,滿足bi bi 1且bi 10 9.資料規模 對於50 的資料中,滿足1 n 1000 對於...
P1631 序列合併
有兩個長度都是n的序列a和b,在a和b中各取乙個數相加可以得到 n 2n2 個和,求這 n 2n2 個和中最小的n個。輸入格式 第一行乙個正整數n 第二行n個整數 a iai 滿足 a i le a ai ai 1 且 a i le 10 9ai 10 9 第三行n個整數 b ibi 滿足 b i ...