問題描述
bessie的生日快到了, 她希望用d (1 <= d <= 100,000; 70%的測試資料都滿足1 <= d <= 500)天來慶祝. 奶牛們的注意力不會太集中, 因此bessie想通過提供玩具的方式來使它們高興. 她已經計算出了第i天需要的玩具數t_i (1 <= t_i <= 50). bessie的幼兒園提供了許多服務給它們的奶牛程式設計師們, 包括乙個每天以tc (1 <= tc <= 60)美元賣出商品的玩具店. bessie想盡可能的節省錢, 但是farmer john擔心沒有經過消毒的玩具會帶來傳染病(玩具店賣出的玩具是經過消毒的).輸入格式 輸出格式 樣例輸入有兩種消毒的方式. 第1種方式需要收費c1美元, 需要n1個晚上的時間; 第2種方式需要收費c2美元, 需要n2個晚上的時間(1 <= n1 <= d; 1 <= n2 <= d; 1 <= c1 <= 60;1 <= c2 <= 60). bessie在party結束之後把她的玩具帶去消毒. 如果消毒只需要一天,那麼第二天就可以拿到; 如果還需要一天, 那麼第三天才可以拿到.
作為乙個受過教育的奶牛, bessie已經了解到節約的意義. 幫助她找到提供玩具的最便宜的方法.
4 1 2 2 1 3樣例輸出 設f(8 2 1 6
x)表示總共買
x 個玩具提供玩具的總費用,設g(
x)表示總共買
x 個玩具所需要的給玩具消毒的費用。
那麼顯然有f(
x)=g
(x)+
x×tc
那麼由於此題可以用費用流求解,那麼根據vfk神犇的證明,f(
x)的一階導數單調不降,因此f(
x)是下凸的單峰函式。具體證明參見vfk。
那麼如何求解g(
x),貪心即可。
如果慢消毒的費用比快消毒高,那麼顯然只用快消毒。
如果買玩具比消毒便宜,那麼顯然全部買。
之後考慮一般情況,如果時間允許,那麼顯然慢消毒是更優的。
因此開三個單調佇列維護,維護時間單調遞減。
第乙個佇列
a 表示慢消毒的玩具,第二個佇列
b表示快消毒的玩具,第三個佇列
c 表示還沒有完成消毒的玩具。
維護時,每天用完的玩具加到c佇列中。
當c佇列的隊首時間與現在的時間差值大於等於快消毒時間時,將他加入b中。
當b佇列的隊首時間與現在的時間差值大於等於慢消毒時間時,將他加入a中。
每次優先用c佇列的隊首,然後再用b佇列的隊尾,不夠用就說明買的不夠,返回無窮大。
貪心的正確性是顯然的,具體可參考**。
**:
#include
#include
#include
#include
#define n 123456
using
namespace
std;
struct node
};deque
a,b,c;
int d,n1,n2,c1,c2,tc,t[n],sum;
int ok(int k)
else
}else
if(b.size())
else
}else
return
1e9;
}c.push_back(node(t[i],i));
}return ans;
}void ef(int l,int r)
while(l<=r)ans=min(ans,ok(l)),l++;
printf("%d",ans);
}int main()
if(n1if(c1>=c2)n1=n2,c1=c2;
ef(0,sum);
}
NKOJ 2723 PYC 的送分題 三分
問題描述已知n 條二次函式曲線si x a ix2 bix ci a i 0 s i x a ix 2 b ix c i a i geq 0 si x ai x2 b i x ci ai 0 定義f x ma xf x max f x m ax,求出f x f x f x 在 0,1000 0,10...
題 字首和 NKOJ 3049 三分陣列
nkoj 3049 三分陣列 時間限制 10000 ms 空間限制 65536 kb 問題描述 給出乙個有n 個整數的陣列a 1 a 2 a n 有多少種方法把陣列分成3 個連續的子串行,使得各子串行的元素之和相等。也就是說,有多少個下標對i,j 2 i j n 1 滿足 sum a 1 a i 1...
bzoj3874 宅男計畫 三分 貪心
題意 有許多種食品,每種有 保質期兩種屬性,乙個人有乙個數目的錢,求這個人可以活多久。如果資料範圍小一點那這個顯然可以 dp 然而 0 si 10 1 f,pi,m 10 1 n 200 我也很絕望啊 首先這個東西是個凸函式 為什麼?我不知道聯想生活實際 也就是存活天數是與送餐次數成凸函式 其實不是...