題目鏈結:hdu4546
題目大意:給n長度的數字序列,從中取出k個元素(0解題思路:第一次做這樣組合的題,第一直覺會想用爆搜窮舉出所有組合,然後扔進multiset中維護這些值,搜尋的複雜度是指數級,記憶體也超限。發現找到第m個小的可以直接用優先佇列來模擬,因為m<10000,所以可以模擬到第m大就結束(其實用multiset也可以,不過沒想出來)。思路是這樣的:初始狀態為0,每次出隊的值一定是將來加上又乙個值後最小的,然後將來的那個值要的情況和不要的情況分別入隊,從而為下下次的選取提供基礎比如:(1 2 3 4 5),1要入隊(sum = 1),1不要入隊(sum = 0);2要入隊(sum = 2),2不要入隊(sum = 0);3要入隊(sum = 3),3不要入隊(sum = 0);4要入隊(sum = 4),4不要入隊(sum = 0)…無形之間就把(1),(2),(3),(4),…,(1,2),(1,3)…都考慮完畢,這裡有個前提:有序。(ps:不要試圖用字首和列舉,因為中間間隔的組合方案沒能考慮到,只能是連續的)
ac**1
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
(int
)1e4+5
;int n,m;
//n個題目 第m小
int num[maxn]
;//int prefix_sum[maxn];
//multiset> v;
struct node
node
(int now_point,
int now_point_sum)
:now_point
(now_point)
,now_point_sum
(now_point_sum)
~node()
bool
operator
>
(const node& a)
const
return
false;}
node operator+(
int a)
const
else
tmp.now_point =
this
->now_point +1;
return tmp;}}
;priority_queue
, greater
> pq;
intmain()
/*不能用字首和 因為存在類似 第1個和第3個的組合無法表示 總組合數應該是2^n-1而不是n*(n-1)/2 而且指數時間一般也超時
for (int i = 1; i <= n; i++)
}*//* for (multiset>::iterator it = v.begin(); it != v.end() && m; it++,m--)
} cout << v.size() << '\n';
*/sort
(num +
1, num +
1+ n)
;while
(!pq.
empty()
) pq.
push
(node(1
,0))
;while
(!pq.
empty()
)if(now.now_point == n)
pq.push
(now +1)
; pq.
push
(now +0)
;}}return0;
}
ac**2
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
(int
)1e4+5
;struct node
node
(int a,
int b,
int c)
:now_sum
(a),
nxt_point
(b),
nxt_sum
(c)}
;struct mycompare };
priority_queue
, mycompare > pq;
int n,m,num[maxn]
;int
main()
while
(!pq.
empty()
)sort
(num,num+n)
; pq.
push
(node(0
,0,num[0]
));while
(!pq.
empty()
)if(now.nxt_point < n -1)
}}return0;
}
HDU4546 比賽難度
設定優先順序佇列 sum 當前和 nex 加入下個元素的和 ith 將要考慮的下個元素 讀入資料後排序,初始化佇列第乙個元素 0,a 0 0 每次出隊乙個元素,入隊 sum,sum a ith ith 1 nex,nex a ith ith 1 即是否加上a ith 都考慮進去了。這樣每次新加入的元...
優先佇列 HDU4546比賽難度
problem description 最近,小明出了一些acm程式設計題,決定在hdoj舉行一場公開賽。假設題目的數量一共是n道,這些題目的難度被評級為乙個不超過1000的非負整數,並且一場比賽至少需要乙個題,而這場比賽的難度,就是所有題目的難度之和,同時,我們認為一場比賽與本場題目的順序無關,而...
HDU1285 確定比賽名次
problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在請你程式設計序...