有一類題,像有n個任務,n個會議,n顆樹,要你按一定的順序執行,使得總用時最少等,通常都需要想乙個貪心策略,然後排序,再用優先佇列逐一處理。
當然貪心是需要證明的,可以先找到乙個序,然後證明交換任意兩項不會更優。然而比賽的時候更多靠直覺。
題意:有n顆植物,每顆植物需要先播種planttime[i]天(不要求連續),再生長growtime[i]天,然後開花,求使所有植物開花的最短時間。
方法:直接說結論:按growtime從大到小排序(感性認識就是,growtime越大提供的plantime的位置也越多,反正plantime也不要求連續,總能將growtime帶來的空位填滿)
比賽的時候我猜的growtime-planttime,不一定最優,看來是完全不用考慮planttime
畫流水線圖,與每行取max
class solution
sort(vec.begin(), vec.end(), (pair& a, pair& b) );
int res = vec[0].first + vec[0].second;
int sum = 0;
for(int i = 0;i < vec.size();i++)
}return res;
}};
題意:n個任務,每次取可行任務中執行時間最短的執行
方法:先按開始時間排序,列舉時間,每次將能開始的加入佇列中,並取隊首執行
class solution
};vectorgetorder(vector>& tasks)
sort(tasklist.begin(), tasklist.end(), (task& a, task& b) );
/*2. processingtime 短作業優先*/
auto cmp = (const task& a, const task& b) ;
priority_queue, decltype(cmp)> pq(cmp);
int n = tasklist.size();
long long curtime = 0; /* 3. 列舉時間 */
int idx = 0;
vectorans;
int cnt = 0;
while(cnt < n)
}return ans;
}};
方法:和上面一題非常類似,也是先能放就放,然後取最大的執行,直到取到k個任務。
class solution );
sort(tasks.begin(), tasks.end());
priority_queuepq;
int cnt = 0;
int i = 0, curw = w;
while(i < n || (!pq.empty())) else
}return curw;
}};
方法:按工作效率從大到小排序,這樣列舉到的每個效率值都是當前最小值。與此同時,將速度用乙個大小為k的最小堆維護.
class solution );
sort(engineers.begin(), engineers.end(), greater()); // efficiency從大到小
long long cnt = 0, ans = 0, sum = 0;
priority_queue, greater>pq;
for(int i = 0;i < n;i++)
else
}ans = max(ans, engineers[i].first * sum); // 相當於列舉了最小效率值
}return (int)(ans % mod);
}};
方法:從前往後,維護乙個大小為ladders的堆,且磚塊也不夠用時返回
class solution // 大於梯子數就每次換個最小的出來
if(bricks < 0) return i;
i++;}}
return i;
}};
方法:負數才要反轉,維護k個最小的負數,如果k有剩餘就去修改絕對值最小的那個數
class solution
priority_queue, greater>pq;
int cur_sum = 0;
for(int num : nums)
else
} }
}// cout << sum << " " << cur_sum << endl;
int ans = sum + 2*cur_sum;
if((k - pq.size()) % 2 == 1)
return ans;
}};
Leetcode優先佇列 雙端佇列 堆排序 桶排序
class solution for int i 0 i k i return res class solution while q.empty nums q.back nums i q.push back i if i k 1 i為下標,k為長度,需要減1 res.push back nums q...
HDU 6709 CCPC網路賽H 優先佇列 貪心
題意 n條魚在河裡,每次花k的時間抓一條,每次只能在鍋裡煮一條,時間是ti,把魚丟進鍋裡是瞬間的,抓魚必須是連續k的時間,魚在煮的時候可以去抓魚,求煮完的最短花費時間 又是乙個用優先佇列反悔的貪心。這種貪心一般就是套路,先一直選決策a,再把決策b的情況丟進優先佇列,不能進行決策a的時候就從優先佇列取...
優先佇列自動排序
優先佇列自動從從小到大排序,我也是看不懂啊 本來打算用哈夫曼樹的,完全符合裡面的wpl 葉子節點的帶權路徑長度之和 可是不會寫 啊!題目描述 description 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩...