[USACO Nov08]玩具toys解题报告

P7368 [USACO05NOV]Asteroids G P7368 [USACO05NOV]Asteroids G 提交1.08k 通过589 时间限制1.00s 内存限制256.00MB 提交答案加入题单 复制题目 题目提供者Jayun 难度提高+/省选- 历史分数100 提交记录查看题解 标签 USACO2005 查看算法标签 进入讨论版 相关讨论 查看讨论 推荐题目 查看推荐 洛谷推荐关闭 展开 题目描述 贝茜想在N\times NN×N的网格中驾驶她的宇宙飞船。网格中有... 阅读详情

题目


分析

首先,稍有常识的人都会看出,这道题其实就是网络流24题中“餐巾问题”的加强版。

“餐巾问题”的标准做法是费用流:每天拆成两点(i,i'),然后S向i'连容量Ti(第i天用量),费用0的边,代表当天的脏餐巾。当然还有别的边,但这个是最重要的。

其实“餐巾问题”还有一个枚举+贪心的做法。

假设我们已经确定了一共新买多少餐巾。那我们一开始就把这些餐巾全买下来,然后从第1天到第N天逐天进行模拟:

①如果还有一些新买的餐巾,就用掉它们。

②如果不够,从后往前枚举第i-slow~1天,慢洗这些天的脏餐巾。(慢洗需要slow天)

③如果还不够,从后往前枚举第i-fast~i-slow+1天,快洗这些天的脏餐巾。(快洗需要fast天)

这个做法的正确性比较显然。就是尽量慢洗,不行再尽量快洗,并且尽量使用靠后日期产生的脏餐巾。

对“餐巾问题”而言,我们只需要暴力枚举总共买多少餐巾即可。

但对于这里N<=10^5的情况而言,暴力枚举并不行。

怎么办呢?

答案是:假如把新买x个的花费视作一个函数f(x),那么它是单峰的(严格来讲是下凸)。

为什么呢?回到我们的网络流模型。一开始我们会把代表脏餐巾的边流满(费用为0),然后每流一次,就代表多买一些餐巾。而每次找出的最短路长度是在不断上升的,换言之,f(x)的一阶导数在不断上升(这个‘一阶导数’可以粗略地认为是每次找出的最短路长度)。于是f(x)就是下凸的了。

所以三分x就可以解决N<=10^5的这道题了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
using namespace std;
typedef long long LL;
const int SIZEN=100010;
const int INF=0x7fffffff/2;
int N;
int price;
int slow_cost,slow_wait,fast_cost,fast_wait;
int need[SIZEN]={0};
deque<pair<int,int> > can_slow,can_fast,late;//first是日期,second是个数
int calc(int buy){//购买buy个
	int ans=buy*price;
	can_fast.clear();can_slow.clear();late.clear();
	for(int i=1;i<=N;i++){
		while(!late.empty()&&late.front().first<=i-fast_wait){
			can_fast.push_back(late.front());
			late.pop_front();
		}
		while(!can_fast.empty()&&can_fast.front().first<=i-slow_wait){
			can_slow.push_back(can_fast.front());
			can_fast.pop_front();
		}
		int now=need[i];
		int t=min(now,buy);
		now-=t,buy-=t;
		while(now&&!can_slow.empty()){
			t=min(now,can_slow.back().second);
			ans+=t*slow_cost;
			now-=t,can_slow.back().second-=t;
			if(!can_slow.back().second) can_slow.pop_back();
		}
		while(now&&!can_fast.empty()){
			t=min(now,can_fast.back().second);
			ans+=t*fast_cost;
			now-=t,can_fast.back().second-=t;
			if(!can_fast.back().second) can_fast.pop_back();
		}
		if(now) return INF;
		late.push_back(make_pair(i,need[i]));
	}
	return ans;
}
void work(void){
	int l=0,r=0;
	for(int i=1;i<=N;i++) r+=need[i];
	while(r-l>2){
		int m1=(2*l+r)/3,m2=(l+2*r+2)/3;
		int f1=calc(m1),f2=calc(m2);
		if(f1>=f2) l=m1;
		else r=m2;
	}
	int ans=INF;
	for(int i=l;i<=r;i++) ans=min(ans,calc(i));
	printf("%d\n",ans);
}
void read(void){
	scanf("%d",&N);
	scanf("%d%d",&fast_wait,&slow_wait);
	scanf("%d%d",&fast_cost,&slow_cost);
	if(fast_wait>slow_wait){
		swap(fast_wait,slow_wait);
		swap(fast_cost,slow_cost);
	}
	if(slow_cost>fast_cost){
		slow_wait=fast_wait;
		slow_cost=fast_cost;
	}
	scanf("%d",&price);
	for(int i=1;i<=N;i++) scanf("%d",&need[i]);
}
int main(){
	freopen("toy.in","r",stdin);
	freopen("toy.out","w",stdout);
	read();
	work();
	return 0;
}


【线段树】P2846 [USACO08NOV] Light Switching G|LG4|普及+ 农夫约翰试图让奶牛玩智力玩具来保持它们的敏锐。谷仓里的灯是较大的玩具之一。$N (2 \le N \le 10^5)$ 个牛栏编号为 $1 \ldots N$,每个牛栏上面都有一盏灯。起初所有的灯都关着。 共有 $M$ 次操作,分为两种。 1. 指定一个区间 $[S_i,E_i]$,然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开); 2. 指定一个区间 $[S_i,E_i]$,要求你输出这个区间内有多少盏灯是打开的。 阅读详情

相关推荐

《无人驾驶车辆模型预测控制》(第二版)第四章详细学习——算法部分

根据代码进行的“MPC跟踪直线和圆算法”的详细推导学习记录。

Fengdf666的博客 5018

P2918 [USACO08NOV] Buying Hay S-完全背包

状态定义,dp(i,j)表示前i件物品采购严格j个干草的最少花费,状态转移方程比较容易,但是这样会存在一个问题,当重量大于等于h,小于等于h与价格最大值的和时,最小值都有可能出现,不仅存于重量等于h时!接下来就考虑这种可能性出现在哪里,我们只需要寻找大于h的最接近h的最小花费即可,扩展dp表的大小,扩展多少呢,只需要找到每个公司的干草的最大值即可。

qq_74248245的博客 300

第二十届全国大学生智能汽车竞赛极速光电组:MicroPython与恩智浦RT1021的硬件编程实战指南

本文为参加第二十届全国大学生智能汽车竞赛极速光电组的同学提供了一份详尽的MicroPython与恩智浦RT1021硬件编程实战指南。文章深入剖析了选择MicroPython与RT1021这对组合的优势,详细讲解了从开发环境搭建、基础硬件控制(如GPIO、PWM、编码器、CCD)到系统集成(平衡控制、循迹算法)与多任务调试的全过程,旨在帮助参赛者降低嵌入式开发门槛,高效备赛。

wdx0123456的博客 843

[USACO08NOV]Toys G 题解

[USACO08NOV]Toys G 首先可以网络流建图,但是因为 nnn 的范围很大,所以我们考虑换一种方法。 首先考虑网络流建图的时候我们是考虑拆点之后进行跑流量,对于所有满流的情况我们计算一个最小费用。 我们对于这种情况不妨进行二分答案之后进行判断,显然我们二分的不能直接是答案。我们考虑那个条件我们知道了之后可以进行贪心或者 Dp\tt DpDp。总共就那么几个条件,只有购买了多少个是不知道的。那么我们就二分买了几个玩具。 简单思考可以发现对于买的玩具数量和花费是一个二次函数,下凸,进行三分。 具

莫莫 dicol 的博客 232

SAP S/4HANA 数据 API 化与 MCP 集成全流程实战指南

通过 RAP 发布 OData、利用 Communication Arrangement 打通外网、再在 MCP-server 里封装函数签名,你就能把 S/4HANA 的核心数据安全、标准化地暴露给任意支持 MCP 的大模型。这条链路的每一个环节都由 SAP 与 MCP 社区提供了现成框架,既兼顾了企业合规,也让 LLM 落地更为轻量。期待你在项目里把这些拼图真正串联起来,让业务数据与生成式 AI 碰撞出高价值的火花。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 976

WorkBuddy 技能指南:基础办公与文档处理

WorkBuddy 不仅仅是一个对话工具——它通过技能(Skills)系统,将通用 AI 助手转变为具备专业领域能力的智能助手。每个技能都是一套经过精心设计的"能力包",包含专业知识、工作流程和专用工具。本文聚焦于文档处理类技能——这是日常工作中使用频率最高、最实用的能力集合。

u011186532的专栏 703

[USACO08NOV]玩具Toys

第一次发题解,如果有写的不清晰的地方,还请各位指出来owo(为什么这道题之前就只有一篇题解啊emm) 算法:三分+贪心 1.读题之后的第一件事是明确目标和问题: 第一步有同学可能会往DP的方向思考(比如蒟蒻我)。因为我们要处理的问题是我需要买多少个玩具,并且每天分别分多少个给n1,多少个给n2才能使得总和最小。 但是,在DP之前一定要仔细想一想,有一个算法也可以处理部分DP问题但是比DP更优秀,那...

baijiuhao的博客 345

Opencv项目实战:20 单手识别数字0到5

今天要做的是单手识别数字0到5,通过在窗口展示,实时的展示相应的图片以及文字。在这里,我提供一下识别更多数字的方法(0-10)。首先最简便的是双手识别,完全不用更改代码,把图片处理好就行了;其次,就是按照最上面的那张图片,参数figureup是一个长度为5的列表[0,0,0,0,0],你可以参照着手势将其打印出来,然后将其用if条件判断。当然,在我们这边最常见的还是华北手势表示数字,大家按照自己的习惯来就行。

m0_62919535的博客 2877

[USACO08NOV]玩具Toys [洛谷2917] [bzoj1229]

餐巾计划问题(费用流经典题),数据加强。

Gorden的博客 966

行业变革下的功能安全落地痛点3:高阶智驾安全责任转移 —— 从 “人为中心” 到 “机器主责” 的产业阵痛

文章围绕高阶智驾(L3 级)落地挑战,探讨安全责任从 “人控” 向 “机控” 转移的本质、技术短板导致的责任模糊、全球法规实践及技术 - 法规 - 保险的破局路径。

my9111526 126

自主探索型AI Agent:LLM驱动的好奇心与学习动机

随着人工智能技术的飞速发展,传统的AI系统往往依赖于预设的规则和大量的标注数据,其自主学习和适应新环境的能力有限。自主探索型AI Agent旨在打破这种局限,能够在复杂、未知的环境中自主地进行探索、学习和决策。本文的目的是深入研究在大语言模型(LLM)驱动下,AI Agent如何产生好奇心和学习动机,以及如何实现自主探索的能力。范围涵盖了核心概念、算法原理、数学模型、项目实战、应用场景等多个方面,为读者提供一个全面的技术视角。本文将按照以下结构进行阐述:首先介绍相关背景知识,包括目的、读者和文档结构;

大模型应用工坊 997

BZOJ 1229: [USACO2008 Nov]toy 玩具

真是一道揪心的题呢。。。

cgh_Andy's Blog 2094

tsmc12:via0的spacing问题(Via0.S.1)

12nm有个via0 grid的概念,除了普通fill外,基本都有via0这一层,这一层需要与via0 grid对齐。手动调整cell的位置比较容易出这个drc,比如修m0po max length drc时。解决方法1: 替换EEQV类型cell,这种类型是专门为了修via0 Grid问题存在的。更多学习内容请关注「拾陆楼」知识星球。解决方法2: 翻转或移动。

m0_61544122的博客 1115

三分+贪心 [USACO2008 Nov]toy 玩具

问题 A: [USACO2008 Nov]toy 玩具 时间限制: 1 Sec 内存限制: 162 MB 题目描述 玩具 [Chen Hu, 2006] Bessie的生日快到了, 她希望用D (1 <= D <= 100,000; 70%的测试数据都满足 1 <= D <= 500)天来庆祝. 奶牛们的注意力不会太集中, 因此Bessie想通过提供玩具的方式来使它们高兴. 她已经计算出了第

蒟蒻QTY 598

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C++ 真题】P2920 [USACO08NOV] Time Management S

作为一名忙碌的商人,约翰知道必须高效地安排他的时间。他有N1≤N≤1000个工作要做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的。为了高效,约翰列出了所有工作的清单。第i1≤i≤N个工作需要Ti​1≤Ti​≤1000单位的时间来完成,而且必须在1≤Si​≤106或之前完成。现在是0时刻。约翰做一份工作必须直到做完才能停止。所有的商人都喜欢睡懒觉。请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成。(如果始终无法完成全部任务,输出−。

Ω 959

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

打卡信奥刷题(1290)用C++实现信奥 P2918 [USACO08NOV] Buying Hay S

约翰的干草库存已经告罄,他打算为奶牛们采购H1≤H≤50000磅干草。他知道N1≤N≤100个干草公司,现在用1到N给它们编号。第i公司卖的干草包重量为Pi​1≤Pi​≤5000磅,需要的开销为Ci​1≤Ci​≤5000美元。每个干草公司的货源都十分充足, 可以卖出无限多的干草包。帮助约翰找到最小的开销来满足需要,即采购到至少H磅干草。

Loge谈信奥--一个专注于信奥人的博客 4904

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

P2918 [USACO08NOV] Buying Hay S 题解

P2918 [USACO08NOV] Buying Hay S 题解

yaosichengalpha的博客 839

P2916 [USACO08NOV]安慰奶牛Cheering up the Cow

题目 P2916 [USACO08NOV]安慰奶牛Cheering up the Cow 分析 这题开始不是很懂它的意思,看了题解才懂的。举个例子:有一条边 a->b 那么假定我们从a点出发再回到a点,先从a点出发,加上a点权值和边权,再从b回到a 加上b点权值和边权,那么对于每一条边,他的边权是不是就等于边权 * 2 + 起点的边权 + 终点的边权呢?即 edge[i].w = t[edg...

qq_52051345的博客 181

P2920 [USACO08NOV] Time Management S:解题报告:最迟开工时间:高效完成所有工作

作为一名忙碌的商人,约翰知道必须高效地安排他的时间。他有 $N(1\le N\le 1000)$ 个工作要做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的。为了高效,约翰列出了所有工作的清单。第个工作需要单位的时间来完成,而且必须在或之前完成。现在是时刻。约翰做一份工作必须直到做完才能停止。所有的商人都喜欢睡懒觉。请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成。(如果始终无法完成全部任务,输出。

2301_79927216的博客 234

【Usaco Nov08 Gold】玩具 三分+贪心

题目描述 Bessie's birthday is coming up, and she wishes to celebrate for the next D (1 <= D <= 100,000; 70% of testdata has 1 <= D <= 500) days. Cows have short attention spans so Bess...

weixin_30549657的博客 279

洛谷P2846 [USACO08NOV]光开关Light Switching 线段树+区间反转

洛谷P2846 [USACO08NOV]光开关Light Switching 标签 线段树 区间反转 简明题意 给出一排初始时都关闭着的灯,现需要你支持两张操作。 将区间[L,R]的灯都反转 询问区间[L,R]亮着的灯的数量 思路 区间操作显然线段树可以解决 我们给每个节点两个属性: sum表示当前区间开着的灯的数量 tag表示这个区间的开关还有多少次未被按下 我们...

danzh 519

洛谷 P2916 [USACO08NOV] Cheering up the Cow G 题解

S_j!约翰有N个牧场,编号依次为1到N。每个牧场里住着一头奶牛。连接这些牧场的有P条道路,每条道路都是双向的。第j条道路连接的是牧场Sj和Ej,通行需要Lj的时间。两牧场之间最多只有一条道路。约翰打算在保持各牧场连通的情况下去掉尽量多的道路。约翰知道,在道路被强拆后,奶牛会非常伤心,所以他计划拆除道路之后就去忽悠她们。约翰可以选择从任意一个牧场出发开始他维稳工作。当他走访完所有的奶牛之后,还要回到他的出发地。每次路过牧场i的时候,他必须花Ci的时间和奶牛交谈,即使之前已经做过工作了,也要留下来再谈一次。

xiaolongmeiya的博客 1928

打卡信奥刷题(1291)用C++实现信奥 P2920 [USACO08NOV] Time Management S

作为一名忙碌的商人,约翰知道必须高效地安排他的时间。他有N1≤N≤1000个工作要做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的。为了高效,约翰列出了所有工作的清单。第i1≤i≤N个工作需要Ti​1≤Ti​≤1000单位的时间来完成,而且必须在1≤Si​≤106或之前完成。现在是0时刻。约翰做一份工作必须直到做完才能停止。所有的商人都喜欢睡懒觉。请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成。(如果始终无法完成全部任务,输出−。

Loge谈信奥--一个专注于信奥人的博客 5269

luogu2916 [USACO08NOV]

http://www.elijahqi.win/2017/07/23/luogu2916-usaco08nov/ 题目描述 Farmer John has grown so lazy that he no longer wants to continue maintaining the cow paths that currently provide a way to visit each ...

Elijahqi 6978

[USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告

[USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告 题目描述 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的。这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍。在一只混乱的队 伍中,相邻奶牛的编号之差均超过K。比如当K = 1时,1, 3, 5, 2, 6, 4就是一支混乱的队伍, 而1, 3, 6, 5, 2, 4不是,因为...

hanserdaisuki的博客 414
上一篇: [USACO Open08]牛的邻居Cow Neighborhoods解题报告
下一篇: [USACO Dec08]巨大的围栏Largest Fence解题报告
wmdcstdio
博客等级 码龄12年 76粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值