HDU 5360 Hiking 優先佇列

2021-07-04 15:09:25 字數 1064 閱讀 9494

題意:beta想要請n個soda去遠足,邀請第i個soda時要符合乙個條件:當前人數不少於li並且不大於ri(如果滿足就同意,即使後來的人數會不符合現在提出的條件),問最多可以邀請多少個soda,輸出數目和邀請順序(若有多種方法輸出任乙個即可)

思路:將soda按照l的值從小到大排列(如果soda!= 0則能邀請的人數為0),每次將符合當前條件的soda(l值不大於當前已參加的人數)放進優先佇列(優先佇列按照ri從小到大),然後取出佇列裡符合條件:r >= 當前已參加人數並且r值較小的那個soda(即為最優)。

把參見的soda從陣列的前面開始放,不參加的從後面開始放即可,最後輸出

#include #include #include #define maxn 1000010

using namespace std;

struct node

}soda[maxn];

bool cmp(node a, node b)

int ans[maxn];

int main()

for(i = 0;i < n;i++)

scanf("%d", &soda[i].r);

sort(soda, soda + n, cmp);

priority_queueq;

now = 0, i = 0, s = 0, e = n- 1;

if(soda[0].l != 0)

for(;i < n&&soda[i].l <= now;i++) q.push(soda[i]);

while(!q.empty())

else ans[e--] = q.top().id;

q.pop();

}for(;i < n&&soda[i].l <= now;i++)

}for(;i < n;i++) ans[e--] = soda[i].id;

printf("%d\n", now);

for(i = 0;i < n;i++) printf("%d%c", ans[i], i==n-1?'\n':' ');

}return 0;

}

hdu 5360 Hiking 優先佇列 貪心

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

HDU 5360 Hiking (貪心 優先佇列)

演算法,思路來自 這篇部落格的 有小錯誤 定義結構體 陣列 左端,右端,原來的位置 答案所求 對於每個樣例 清空佇列 清空放答案的陣列 讀入左端,讀入右端,對結構體陣列按照左端較小在前進行排序 用cnt,和答案陣列,存已經邀請的人 用i存當前掃到的結構體位置 迴圈 佇列不為空時,詢問當前佇列裡,右端...

優先佇列 HDOJ5360 Hiking

題意 有n個人,每個人有兩個引數 l 和 r 邀請他們去hiking,當 當前已經邀請到的人數大於等於 l 並且小於等於 r 那麼這個人就會去 問最多能邀請到幾個人 並輸出 依次要邀請的人的編號 編號1 n 先要按 l 排序 l 小的在前 因為所有 l 小於等於當前已經邀請到的人數的人才能被邀請 對...