HDU 6301 (貪心 優先佇列)

2022-05-01 11:06:12 字數 1255 閱讀 3235

題目大意:

求乙個長度為n的數列, 給出m個區間,這m個區間各自區間內的數不同

題解:用優先佇列來模擬過程 , 解題思路是想到了 , 可是不知道如何實現 , 果然還須繼續努力呀

這道題思路是去掉重複的區間(取最大的區間,用sort+結構體加幾個判斷條件來實現),用優先佇列維護1-n 中沒有出現的數(比如給你乙個10 3 [2  8]  [1  5]  [6  10]  的樣例,把1 到 10 push進優先佇列後,排序後[1  5]  這個區間先,所以先從優先佇列裡取 1 2 3 4 5,此時佇列剩下6 7 8 9 10,下個區間 [2  8] ,我們先把[ 1  2 )這個區間也就是上次剩下的數丟到優先佇列裡面去。現在優先佇列剩下 1 6 7 8 9 10 ,需要從裡面取出8 - 5 個數,所以結果現在是1 2 3 4 5 1 6 7 。下個區間[ 6  10 ] ,丟[2   6)這個區間的數進優先佇列,也就是 2  3  4  5 這四個數。再從這四個數取 10 - 8 個,所以答案是

1 2 3 4 5 1 6 7 2 3)

參考部落格

#include#include

#include

using

namespace

std ;

intn,m;

int ans[100001

];struct

noa[

100001

];bool

cmp(no a , no b)

priority_queue

,greater >que;

intmain()

sort(a,a+m,cmp);

while(!que.empty())

que.pop();

for(int i=1 ; i<=n ; i++)

ans[i]=1

;

for(int i=1 ; i<=n ; i++)

que.push(i);

intl,r,tr,tl;

l=r=0

; tl=a[0

].u;

tr=tl-1

;

for(int i=0 ; i)

tr=r;tl=l;}}

printf("%d

",ans[1

]);

for(int i = 2;i <= n;i++)

puts(

"");}}

view code

hdu 6301 思路貪心

這個題如果從直接的想法做很簡單,但是時間肯定過不去,難處理的在於如何把用完了的數字重新利用 這個題解是dls的 大體思路是用pre i 記錄i所在的區間的左端點,然後設定乙個標記用來記錄已經處理完的位置 不是填完數字的位置,是既填完了數字又將可利用的數字處理完了的位置 當標記小於pre i 時表明 ...

hdu 4544 優先佇列 貪心

題意 最近,失敗的湫湫為發洩心中鬱悶,在玩乙個消滅免子的遊戲。遊戲規則很簡單,用箭殺死免子即可。箭是一種消耗品,已知有m種不同型別的箭可以選擇,並且每種箭都會對兔子造成傷害,對應的傷害值分別為di 1 i m 每種箭需要一定的qq幣購買。假設每種箭只能使用一次,每只免子也只能被射一次,請計算要消滅地...

hdu 5360 Hiking 優先佇列 貪心

題目 題意 beta有n個朋友,beta要邀請他的朋友go hiking,已知每個朋友的理想人數 l,r 現有l r個人準備去,那麼這個朋友就去 求最多有多少人去。及beta邀請朋友的順序。分析 每次邀請人的最優解就是 選會去的人裡面r最小的那個人。實現的話,cur代表已經準備go hiking的人...