HDU4546比賽難度 優先堆 思維 好題

2021-09-10 15:54:00 字數 3007 閱讀 8749

題目鏈結: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之前。現在請你程式設計序...