給定n
個訂單,在相應時刻都要生產num[i]
個月餅,給出m
個可以生產的時刻和這個時刻生產單個產品的費用cost[i]
,每個月餅可以儲存t
個小時的保質期,但是儲存月餅也是要花錢的,每小時儲存需要花費s
,求出最小花費。
一定要讀清楚題意。
其實對於每個訂單都有乙個確定的生產時刻(最優的情況下),並且只有乙個,我們可以使用單調佇列來求出這個最優時刻。這個進佇列的判斷還是有點特殊的,如果當前進佇列的單價花費cost[i] <= cost[que[tail-1]]+s*(i-que[tail-1])
,(這裡的que
陣列是用來模擬佇列的,que
中儲存的是cost
的下標。)就需要隊尾出元素,因為隊尾的元素不如當前時刻的花費更優。單調佇列中還有乙個要點是區間長度,這裡就是用t
來擔當了,雖然隊首的元素時刻的花費(相對當前時刻來說)最優,但是過了保質期也不行啊。這樣我們就可以開做了。
#include#include#include#include#include#include#include#include#includetypedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int maxn=1e5+50;
int n, m, time[2507], t, s, cost[maxn], q[maxn];
ll num[2507];
int getmonth(char* s)
int days[15] = ;
bool isleap(int y)
int get_hours(int y, int m, int d, int h)
for(int i=1; i2)
ans += 24;
ans+=(d-1)*24;
ans+=h;
return ans;
}int main()
}printf("%lld\n", sum);
} return 0;
}
hdu 4122 單調佇列或線段樹
hdu 4122 單調佇列 題目大意 給定n個時刻,在每乙個時刻都要生產ai個月餅。給出m個可以生產的時刻,每個時刻單個生產費用為bi,單個月餅可儲存t時間,單位時間費用為s 問如何安排生產花費最少 解題思路 用單調佇列維護乙個點之前所有點的最小花費 為生產費 儲存費 特別注意 n個時刻可能有重複的...
HDU3415單調佇列
這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...
HDU 3415單調佇列
這個題目屬於常見題型,給定一組環狀數列,求出其中長度不超過k的數字之和的最大值。用到了字首和的技巧,比如要求i,j間所有數字之和,可以提前在輸入的時候計算出從0 i的數字之和及從0 j的數字之和,那麼sum i j sum j sum i 現在的問題是求出最大的sum i j 那麼我們可以固定sum...