給定\(n\)個人,每個人有乙個舞蹈技術值,相鄰且舞蹈技術值相差最小的一對異性會出隊,求出隊的總次數以及出隊的順序。
首先看到最小值,可以想到用小根堆來實現。
先將每一種可能的出隊方案儲存到小根堆中。
可以定義乙個陣列來表示是否出隊。如果相鄰的舞者有人已經出隊,便跳過。
每一次出隊以後,就會產生一對新的相鄰舞者,可以用陣列模擬鍊錶來儲存每一位舞者邊上的人。出隊後便將這一對舞者從鍊錶中刪去,同時在答案陣列中記錄。再判斷新產生的一對相鄰舞者是否滿足出隊要求(注意特判邊界情況)。
最終得到的便是本題的答案。
#include#includeusing namespace std;
const int n=2e5+10;
int n,a[n],nex[n],***[n],pre[n],ans[n][2],cnt;
bool st[n];
char s[n];
int abs(int a)
struct node
};priority_queueq;
int main()
for(int i=1;in||pre[now.l]<1) continue; //特判邊界
if((***[pre[now.l]]^***[nex[now.r]])==1) q.push(node);
//判斷新產生的相鄰舞者是否滿足出隊要求
} }printf("%d\n",cnt);
for(int i=1;i<=cnt;i++) printf("%d %d\n",ans[i][0],ans[i][1]);
return 0;
}
洛谷 P1878 舞蹈課 解題報告
有 n 個人參加乙個舞蹈課。每個人的舞蹈技術由整數來決定。在舞蹈課的開始,他們從左到右站成一排。當這一排中至少有一對相鄰的異性時,舞蹈技術相差最小的那一對會出列並開始跳舞。如果不止一對,那麼最左邊的那一對出列。一對異性出列之後,隊伍中的空白按原順序補上 即 若隊伍為 abcd 那麼 bc 出列之後隊...
堆 洛谷P3378 二叉堆模板
如題,初始小根堆為空,我們需要支援以下3種操作 操作1 1 x 表示將x插入到堆中 操作2 2 輸出該小根堆內的最小數 操作3 3 刪除該小根堆內的最小數 支援兩種操作 1.往乙個集合加乙個數。2.從集合中刪去乙個優先值最大的元素。規則每個結點比兒子優先順序大。插入規則 先插入到最後乙個結點,然後不...
二叉堆 洛谷P1090 合併果子
lp1090 本題需要畫一下圖 可以觀察到 每個果子的代價 重量 在樹中深度 考慮如果構造乙個深度越深的結點權值越小,就能達到最小權值。那麼本題的做法就變成了每次選最小的兩堆果子合併。這個可以用二叉堆來做。include include include include include define ...