吃鸡蛋-优先队列
題目描述
小林養了一只母雞,一連 n 天,每天都可以生下若干個雞蛋。在第 i 天,母雞會生下 eggs[i] 個雞蛋,這些雞蛋將會在days[i] 天后(也就是說,第 i + days[i] 天時)腐爛,變得無法食用。也可能有那么幾天,母雞不會生下新的雞蛋,此時用 eggs[i] = 0 且 days[i] = 0 表示。你打算每天最多吃一個雞蛋來保證營養均衡。注意,你可以在這 n 天之后繼續吃雞蛋。給你兩個長度為 n 的整數數組 eggs 和 days ,返回你可以吃掉的雞蛋的最大數目。
輸入格式
輸出格式
一個整數,你可以吃掉的雞蛋的最大數目。
輸入輸出樣例
輸入 #1
5
1 2 3 5 2
3 2 1 4 2
輸出 #1
7
輸入 #2
6
3 0 0 0 0 2
3 0 0 0 0 2
輸出 #2
5
說明/提示
對于樣例一:
第一天,你吃掉第一天生下的雞蛋。 第二天,你吃掉一個第二天生下的雞蛋。 第三天,你吃掉一個第二天生下的雞蛋。過了這一天,第三天生下的雞蛋就已經腐爛了。 第四天到第七天,你吃的都是第四天生下的雞蛋。對于樣例二:
第一天到第三天,你吃的都是第一天生下的雞蛋。 第四天和第五天不吃雞蛋。 第六天和第七天,你吃的都是第六天生下的雞蛋。1 <= n <= 20000 0 <= eggs[i], days[i] <= 20000
解題思路:
利用優先隊列對新加入的雞蛋進行排序(保質期由短到長),模擬每一天的生蛋棄蛋吃蛋過程。
在前n天里有生蛋的加入優先隊列中;檢查優先隊列中過保質期的蛋舍棄掉;再將保質期最短但未過期的蛋吃掉一個。
最后統計得到吃雞蛋數。
代碼如下:
#include <iostream> #include <queue> using namespace std; const int N = 20010; int s[N], t[N];struct EGG {int num;int e;friend bool operator < (const EGG &a, const EGG &b) {return a.e > b.e;} };int ans = 0; int main() {int n;cin >> n;for (int i = 1; i <= n; i++)cin >> s[i];for (int i = 1; i <= n; i++) {cin >> t[i];if (s[i] > t[i])s[i] = t[i];//雞蛋有2個,保質期才1天,那2個雞蛋最多吃一個,所以我們可以認為這天雞蛋只有一個。}priority_queue<EGG>q;for (int i = 1; i <= n || !q.empty(); i++) {if (i <= n)//因為n天后,我們還可以吃雞蛋,所以加這個條件{if (s[i] != 0) {EGG egg;egg.num = s[i];egg.e = i + t[i];//假如今天是第2天,下了一個保質期2天的蛋,那它在第4天腐爛(吃不了),所以為i+t[i]q.push(egg);}}while (!q.empty()) {EGG badegg = q.top();if (badegg.e <= i) //保質期過了,將腐爛的出隊{q.pop();} elsebreak;}if (!q.empty()) {EGG oneegg;oneegg = q.top();oneegg.num--;if (oneegg.num == 0) {q.pop();} // else { // q.pop(); // q.push(oneegg); // }ans++;}}cout << ans << endl;return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 太牛了,手把手教你在家做一台能玩GBC游
- 下一篇: 上万张零乱照片怎么整理上万张零乱照片怎么