我的天啊,這三題code都一樣
給你一些數,每次可以選取兩個相加成為一個,新數即為得分。所有數加成一個后,求最小得分。
其實就是每次選兩個最小的數相加再放回數列中。
如果用sort效率極低(每次都要sort,時間復雜度為O(n^2*logn))
那么,我們的隊列出廠(當當當當)
#include<iostream>#include<cstdio>#include<queue>using namespace std;long long int i,m,n,j,k;PRiority_queue<long long int>a;int main(){ cin>>n; for(i=1;i<=n;i++){ scanf("%d",&k); a.push(-k); } for(i=1;i<n;i++){ int x,y; x=-a.top(); a.pop(); y=-a.top(); a.pop(); m+=x+y; a.push(-x-y); } cout<<m; return 0;}隊列
其實上面的代碼用到了優先隊列
隊列
先進先出(First In First Out,FIFO)表。STL中為queue。
queue可以在頭部彈出、尾部壓入。
queue<data>a | 定義一個data形的隊列 |
queue<data>a(b) | 隊列a為隊列b的副本 |
a.push(x) | 在隊列尾部壓入x |
a.pop() | 彈出隊列頂部的元素 |
a.top() | 訪問隊首元素 |
其他懶得寫 | 這些就夠了 |
優先隊列與隊列的區別就是優先隊列隊首元素是最大的。
普通的優先隊列為大根堆,若要轉化成小根堆只需元素取相反數即可。
priority_queue<data>a | 定義一個data形的隊列 |
priority_queue<data>a(b) | 隊列a為隊列b的副本 |
a.push(x) | 在隊列尾部壓入x |
a.pop() | 彈出隊列頂部的元素 |
a.top() | 訪問隊首元素 |
其他也懶得寫 | 這些也就夠了 |
新聞熱點
疑難解答