CF round189(div1)C. Kalila and Dimna in the Logging Industry(单调队列斜率优化)

CF round189(div1)C. Kalila and Dimna in the Logging Industry

题意:有n棵树要砍,树的高度a[i],依次递增,且a[1] = 1。每次砍一棵树之后,我们会获得一个电站,在电站i充电时,充满的费用是b[i],且b[n] = 0 ,每砍掉一棵树,我们要给电锯充满电,充电的费用是已获得的电站中,费用最小的那个b[i] 乘以你要去砍的那棵树的高度a[i]。

解题思路:我们发现,既然b[n] = 0 ,那么我们的目的就是用最小的花费去砍掉第n棵树,之后的费用就都是0了。定义dp[i],表示能把i砍掉时,最小的花费是多少,那么dp[i] = dp[j] + b[i] * a[j] , dp[i] , j <= i ,取最小值,这样复杂度为n^2。转换一下思路,dp[i] = dp[j] + b[i] * a[j] 得到 dp[j] = dp[i] - a[i] * b[j],在j的变化过程中,a[i]的值是不变的,因此,我们把这个等式看做一条斜率为-a[i] , 且过(dp[j] , b[j])的直线,那么dp[i]自然就是截距(与y轴的交点),所以我们要求dp[i]最小,就是要找出j变化的过程中,使得其截距最小的那个点。然后就用到单调队列和斜率优化了。这个东西,好复杂,画了好多张纸的直线才弄出来,有大神愿意交流的,请留言。

代码:

 

编写一个 SQL 查询,筛选出过去一年中订单总量 少于10本 的 书籍 ,不考虑 上架(available from)距今 不满一个月 的书籍。并且 假设今天是 2019-06-23。 建表语句如下: Create table If Not Exists Books (book_id int, name varchar(50), available_from date); Create table If Not Exists Orders (order_id int, book_id int, quantity int, dispatch_date date); Truncate table Books; insert into Books (book_id, name, available_from) values ('1', 'Kalila And Demna', '2010-01-01'); insert into Books (book_id, name, available_from) values ('2', '28 Letters', '2012-05-12'); insert into Books (book_id, name, available_from) values ('3', 'The Hobbit', '2019-06-10'); insert into Books (book_id, name, available_from) values ('4', '13 Reasons Why', '2019-06-01'); insert into Books (book_id, name, available_from) values ('5', 'The Hunger Games', '2008-09-21'); Truncate table Orders; insert into Orders (order_id, book_id, quantity, dispatch_date) values ('1', '1', '2', '2018-07-26'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('2', '1', '1', '2018-11-05'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('3', '3', '8', '2019-06-11'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('4', '4', '6', '2019-06-05'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('5', '4', '5', '2019-06-20'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('6', '5', '9', '2009-02-02'); insert into Orders (order_id, book_id, quantity, dispatch_date) values ('7', '5', '8', '2010-04-13');
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值