題目大意:
求乙個長度為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#includeview code#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(
"");}}
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的人...