HDU - 6003 Problem Buyer題解(貪心選擇演算法,鴿巢原理,優先佇列維護)
HDU - 6003 Problem Buyer題解(貪心選擇演算法,鴿巢原理,優先佇列維護)
16年的ccpc final題,題目不長,但是讀題對於我這種蒟蒻還是看了半天,讀懂後大概推測是貪心演算法,用優先佇列維護一個題目區間能夠AC。
具體題解和分析鴿了,以後用空再寫。
稍微加了點註釋希望有幫助:
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
const int inf = 0x3f3f3f3f;
clock_t START, END;
struct difficultyRange {
int l, r;
bool operator < (const difficultyRange& t)const {
return (l == t.l) ? (r > t.r) : (l < t.l);//l升序,l相等時r降序(其實r怎麼排序都無所謂)
}
}dr[100010];
int main() {
std::ios::sync_with_stdio(false);//不關閉同步流會使讀取速度過慢,這題經過測試只有關閉才能ac
int T, N, M, c[100010];
cin >> T;
for (int ii = 1; ii <= T; ii++) {
//資料輸入
cin >> N >> M;
for (int i = 1; i <= N; i++) {
cin >> dr[i].l >> dr[i].r;
}
for (int i = 1; i <= M; i++) {
cin >> c[i];
}
START = clock();
//排序題庫和題
sort(dr + 1, dr + 1 + N);
sort(c + 1, c + 1 + M);
int Max = -inf;
int j = 1;
priority_queue<int, vector<int>, greater<int> > Q;//存放當前能夠滿足該題的區間的右端(隊首為最小右端)
for (int i = 1; i <= M; i++) {//遍歷每一個題目,確定 1.其對應題庫內題目 以及 2.其題庫內的最小購買數
//這倆個while迴圈能保證佇列內永遠是此時題目所符合的題庫範圍
while (!Q.empty() && Q.top() < c[i])
Q.pop();//由於此時的題目難度更高了,可能原來的左端會不滿足,這裡將不滿足的題目出隊
while (j <= N && dr[j].l <= c[i]) {
if (dr[j].r >= c[i]) {
Q.push(dr[j].r);//將滿足條件的題庫內題目的右端入隊
}
j++;
}
Max = max(Max, N - (int)Q.size() + 1);//Q.size()是題庫內滿足我們要出的題目的難度範圍的題目個數,N-size+1即最小的題庫選擇數量,
if (Max > N)
break;
if (!Q.empty())
Q.pop();//將右端最小的值貪心選擇掉,接下來這個題目範圍不能繼續去匹配我們要出的題目
}
if (Max > N)
cout << "Case #" << ii << ": IMPOSSIBLE!" << endl;
else
cout << "Case #" << ii << ": " << Max << endl;
END = clock();
double endtime = (double)(END - START) / CLOCKS_PER_SEC;
cout << "Total time:" << endtime * 1000 << "ms" << endl;
}
return 0;
}
相關文章
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- CodeForces - 960B:Minimize the error(優先佇列+貪心)Error佇列
- Sunscreen POJ - 3614(防曬油) 貪心-優先佇列佇列
- [USACO 2009 Feb Gold] Fair Shuttle (貪心+優先佇列)GoAI佇列
- 活動選擇問題理解貪心演算法演算法
- 貪心-*活動選擇
- Find the Maximum - 題解【思維,貪心】
- HDU 5821 Ball(貪心)
- Java優先順序佇列DelayedWorkQueue原理分析Java佇列
- 演算法面試(三) 優先佇列演算法面試佇列
- PHP優先佇列PHP佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- HDU 6047 Maximum Sequence (貪心)
- HDU 5813 Elegant Construction (貪心)Struct
- STL 優先佇列 用法佇列
- 淺談優先佇列佇列
- 堆與優先佇列佇列
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- HDU 6299-Balanced Sequence(貪心)
- hdu--4435--charge-station+貪心
- LeetCode解題記錄(貪心演算法)(二)LeetCode演算法
- LeetCode解題記錄(貪心演算法)(一)LeetCode演算法
- 優先佇列和堆排序佇列排序
- 最詳細版圖解優先佇列(堆)圖解佇列
- 01揹包優先佇列優化佇列優化
- codeforces round 974(div.3)E(優先佇列實現dijstra演算法,devc++的優先佇列用greater報錯)佇列JS演算法devC++
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 棧,佇列,優先順序佇列簡單介面使用佇列
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- 使用貪心演算法解決集合覆蓋問題演算法
- 貪心演算法——換酒問題演算法
- 演算法與資料結構番外(1):優先佇列演算法資料結構佇列
- STL優先佇列最小堆最大堆佇列
- leetcode621——優先佇列的思路LeetCode佇列
- 貪心演算法演算法
- 貪心演算法篇——區間問題演算法