hdu 4546 優先佇列 數列組合和第m小
題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4546
題意:給你n個數,問這n個數的組合的和,第m小是多少
分析:很明顯的,要給初始序列排序(我寫的時候居然忘記排序了,看來下次得把步驟寫下來= =),然後發揮想像力,你會發現這其中有一定規律,我們可以假設有這樣的元素,
struct data
{
int start, i;
}
序列為a[ i ],start表示當前的組合的和,i表示下次新增的元素為a[ i ];
將這些元素加入優先佇列
一開始只有 a.start=0, a. i=0的元素,肯定是選擇他,將他取出,然後得到兩個元素,b.start=a.start, b.i=a.i+1, c.start=a.start+a[i], c.start=i+1
這個也就是說將組合的最後一個元素往後移,得到一個新組合,或者把當前組合作為一個新的開頭,也就是組合個數多加一個,並且最後一個元素大於前面的元素
這樣能保證每次彈出的元素是最小的,並保證生成的元素不會重複,所以問題得到解決
將得不是很清楚,看看程式碼就明白了
程式碼:
/** head files*/
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;
/** some operate*/
#define PB push_back
#define MP make_pair
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)
#define MSET(arr,val) memset(arr,val,sizeof(arr))
#define MAX3(a,b,c) max(a,max(b,c))
#define MAX4(a,b,c,d) max(max(a,b),max(c,d))
#define MIN3(a,b,c) min(a,min(b,c))
#define MIN4(a,b,c,d) min(min(a,b),min(c,d))
/** some const*/
#define N 222222
#define M 222222
#define PI acos(-1.0)
#define oo 1111111111
/** some alias*/
typedef long long ll;
/** some template names, just push ctrl+j to get it in*/
//manacher
int a[N];
typedef struct data
{
int start,i;
data():start(0),i(0){}
data(int a, int b):start(a),i(b){}
}way;
struct cmp
{
bool operator()(const data &x, const data &y)
{
return x.start+a[x.i]>y.start+a[y.i];
}
};
priority_queue< way, vector<way> , cmp > pq;
int main()
{
int i,n,m,t,ans,cs=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;++i)
scanf("%d",&a[i]);
sort(a,a+n);
while(!pq.empty())pq.pop();
pq.push(data(0,0));
ans=0;
while(m--)
{
if(pq.empty())continue;
way tmp=pq.top();
ans=tmp.start+a[tmp.i++];
pq.pop();
if(tmp.i<n)
{
pq.push(tmp);
tmp.start=ans;
pq.push(tmp);
}
}
printf("Case #%d: %d\n",++cs,ans);
}
return 0;
}
相關文章
- 優先佇列和堆排序佇列排序
- PHP優先佇列PHP佇列
- STL 優先佇列 用法佇列
- 淺談優先佇列佇列
- 堆與優先佇列佇列
- 【堆】【優先佇列】[NOIP2004]合併果子佇列
- RMQ——支援合併和優先順序的訊息佇列MQ佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 棧,佇列,優先順序佇列簡單介面使用佇列
- 01揹包優先佇列優化佇列優化
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 堆、堆排序和優先佇列的那些事排序佇列
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- 全網最適合入門的物件導向程式設計教程:41 Python 常用複合資料型別-佇列(FIFO、LIFO、優先順序佇列、雙端佇列和環形佇列)物件程式設計Python資料型別佇列
- STL優先佇列最小堆最大堆佇列
- leetcode621——優先佇列的思路LeetCode佇列
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- 1284 海港 普及組 NOIP2016 佇列基礎 簡單列舉 簡單模擬 優先佇列(priority_queue)佇列
- 牛客網 複數集合(小根堆的優先佇列、北郵機試)佇列
- 演算法面試(三) 優先佇列演算法面試佇列
- 二叉堆實現優先佇列佇列
- 手擼優先佇列——二叉堆佇列
- C++ STL 優先佇列 (priority_queue)C++佇列
- .NET 6 優先佇列 PriorityQueue 實現分析佇列
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 佇列 和 迴圈佇列佇列
- HDU 4549 M斐波那契數列(矩陣快速冪+費馬小定理)矩陣
- 最詳細版圖解優先佇列(堆)圖解佇列
- Facebook的分散式優先順序佇列FOQS分散式佇列
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- codeforces round 974(div.3)E(優先佇列實現dijstra演算法,devc++的優先佇列用greater報錯)佇列JS演算法devC++
- netcore下RabbitMQ佇列、死信佇列、延時佇列及小應用NetCoreMQ佇列
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- time模組,collections模組,佇列和棧佇列
- CodeForces - 960B:Minimize the error(優先佇列+貪心)Error佇列
- Sunscreen POJ - 3614(防曬油) 貪心-優先佇列佇列
- [USACO 2009 Feb Gold] Fair Shuttle (貪心+優先佇列)GoAI佇列