JZOJ3673. 【JSOI2014】宅男计划(food)

该博客介绍了JSOI2014比赛中的一道题目,涉及如何利用三分法解决购买食物的最优化问题。博主首先说明了题目要求,即在有限预算和外卖费用下,最大化连续吃食物的天数。接着,博主指出预处理步骤是剔除高价短保质期的食物,并通过单调栈实现。核心解题策略是应用三分法来确定最佳外卖次数,因为总花费与外卖次数的关系呈先增后减的二次函数特性。博主解释了如何找到每个外卖次数对应的最长连续吃食天数,并指出最优解会形成一个循环模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

给你一共n种食物,每种食物有两个参数p,s,分别表示价格为p,保质期为s。然后你以叫外卖的形式去购买食物,每种食物都有无限多,你每叫一次外卖都要花费f元,你每次叫的外卖都可以叫无限多次,然后你一共有m元,试求你最多能连续多少天吃到食物。

分析

  • 题目大意说得好像不是很清楚,不过没事题面各大OJ都有。这道题用到了一个比较少用的算法——三分法。首先有个很显然但很重要的预处理,你一定要先将那些价格又高保质期又短的食品全部淘汰掉,可以用到一个单调栈即可。主体部分不妨可以脑补一下,点的外卖次数多了配送费就多了,但是单次购买的费用就少了(因为预处理过后保质期越短价格一定越小),但是如果外卖次数少了拿花费的费用就多了,因此这是一个类似于开口向下的二次函数,所以我们需要用到三分法,不断往中间靠,直到找出最大值。总的来说二分法适用于单调递增或单调递减的情况,三分法适用于先增后减或先减后增的情况。
  • 但是鉴于本题的特殊性我们不三分答案而是三分点外卖的次数。对于每一个mid我们要求出再点外卖次数为mid次的情况下能最多连续吃到食物的天数,至于如何处理出这个答案,我们不难发现这个最优情况一定是一个个循环节一样的模式,然后最后若没办法补齐就直接补到哪算哪。

Code

#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;

const int N = 220;
struct Node{
   
	ll p,s;
} a[N],b[N];
ll m,f,n,ans;
ll l,r,mid1,mid2,top;

ll read()
{
   
	ll x = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') ch = getchar();
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值