news 2026/7/13 10:31:46

USACO历年白银组真题解析 | 2024年1月Potion Farming

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
USACO历年白银组真题解析 | 2024年1月Potion Farming

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总贴:USACO历年白银组真题解析 | 汇总-CSDN博客


【题目来源】

洛谷:[P10135 USACO24JAN] Potion Farming S - 洛谷

【题目描述】

你正在玩你最喜欢的手机游戏。在尝试收集药水,以便有机会击败传说中的牛头怪boss。游戏地图是一系列标有1…N的房间,这些房间由N-1条边连接形成一棵树( 2 ≤ N ≤ 10 5 ) (2\le N\le 10^5)(2N105)

你可以通过进行一系列的“遍历”来探索地图。一次遍历是从房间1到树中任何其他房间的一条简单路径。一次遍历结束后,你可以从房间1开始另一次遍历。一旦地图的每个房间至少被遍历过一次,地图就算完成。你的主要目标是用最少的遍历次数完成地图。 你的次要目标是尽可能多地收集药水。在一次遍历开始前,一瓶药水会在地图上的某个房间生成。通过在当前遍历中生成药水的房间你就可以捡起它。如果你没有捡起药水,那么它将在当前遍历结束后消失,所以你不能在未来的遍历中捡起它。 作为一个聪明的程序员,在查看游戏文件后,你能够在接下来的N次遍历之前找出药水将出现在哪里。如果你在最少的遍历次数内完成地图,你可以从地图上收集到的最大数量的药水是多少?

【输入】

输入的第一行包含一个整数N,表示地图中房间的数量。 然后是N个空格分隔的整数p 1 p 2 … p N p_1p_2\dots p_Np1p2pN,其中1 ≤ p i ≤ N 1\le p_i\le N1piNp i p_ipi表示在第i次遍历之前药水会出现在哪个房间。

最后,接着是N-1行,每行有两个用空格分隔的整数*a b ( 1 ≤ a , b ≤ N ) a b(1\le a,b\le N)ab(1a,bN)*,代表房间a和b之间的一条边。可以保证这些边组成了一棵树。

【输出】

输出一行包含一个整数,即你可以在最少遍历次数的情况下从地图中获得的最大药水量。

【输入样例】

5 5 4 3 2 1 1 2 1 3 3 4 3 5

【输出样例】

2

【算法标签】

《洛谷 P10135 Potion Farming》 #USACO# #2024#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=100005;intn,p[N],leaf[N],d[N];// leaf[x] -- 以 x 为根的子树中的叶子节点数量// d[x] -- 以 x 为根的子树最多能获得的药水数量vector<int>e[N];// 邻接表存储树// 深度优先搜索计算每个子树的叶子节点数量voiddfs(intx,intfa){// 如果 x 不是根节点且是叶子节点(度为1),则 leaf[x] = 1if(x!=1&&e[x].size()==1){leaf[x]=1;}// 遍历所有子节点for(inti=0;i<e[x].size();i++){inty=e[x][i];if(y==fa)continue;// 避免回溯父节点dfs(y,x);leaf[x]+=leaf[y];// 累加子树的叶子数量}}// 计算每个子树最多能获得的药水数量voidcalc(intx,intfa){// 遍历所有子节点for(inti=0;i<e[x].size();i++){inty=e[x][i];if(y==fa)continue;// 避免回溯父节点calc(y,x);d[x]+=d[y];// 累加子树的药水数量}d[x]=min(d[x],leaf[x]);// 药水数量不超过叶子数量}intmain(){scanf("%d",&n);// 输入节点数量// 输入每个节点的优先级 p[i]for(inti=1;i<=n;i++){scanf("%d",&p[i]);}// 构建树的邻接表for(inti=1;i<n;i++){inta,b;scanf("%d%d",&a,&b);e[a].push_back(b);e[b].push_back(a);}dfs(1,0);// 从根节点开始计算叶子数量// 根据优先级分配初始药水(前 leaf[1] 个优先级最高的节点获得 1 药水)for(inti=1;i<=leaf[1];i++){d[p[i]]++;}calc(1,0);// 从根节点开始计算最大药水数量printf("%d\n",d[1]);// 输出根节点能获得的最大药水数量return0;}

【运行结果】

5 5 4 3 2 1 1 2 1 3 3 4 3 5 2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 18:30:17

分糖果(candy)(信息学奥赛一本通- P1380)

【题目描述】童年的我们&#xff0c;将和朋友分享美好的事物作为自己的快乐。这天&#xff0c;C小朋友得到了Plenty of candies&#xff0c;将要把这些糖果分给要好的朋友们。已知糖果从一个人传给另一个人需要1 秒的时间&#xff0c;同一个小朋友不会重复接受糖果。由于糖果足…

作者头像 李华
网站建设 2026/7/3 14:29:41

大数据领域数据压缩的常见误区与纠正

大数据领域数据压缩的常见误区与纠正&#xff1a;拨开迷雾&#xff0c;探寻真相 关键词&#xff1a;大数据、数据压缩、误区、无损压缩、有损压缩、压缩算法、存储效率、传输速度 摘要&#xff1a;在大数据时代&#xff0c;数据量呈爆发式增长&#xff0c;数据压缩成为应对数据…

作者头像 李华
网站建设 2026/7/8 17:18:39

Alpha Wire 工业线缆材料与温度等级深度解读

在工业自动化、设备控制、机械制造等系统设计中&#xff0c;线缆的材料、温度等级与结构直接关系到系统稳定性与长期可靠性。Alpha Wire 作为全球领先的线缆和电线制造商&#xff0c;其工业线缆产品涵盖多种绝缘材料、护套工艺和温度等级&#xff0c;为工程师提供了灵活的设计选…

作者头像 李华
网站建设 2026/7/1 0:36:39

Kubernetes(三)——组网概念和基础操作指令

文章目录前言一、客户端访问k8s集群架构图二、k8s组网方案1、为什么要部署CNI网络组件2、flannel概述2.1、flannel是什么2.2、flannel适用场景2.3、flannel网段分配规则2.4、Veth cni0 网桥的作用2.5、K8S 中 Pod 网络通信2.6、flannel的跨主机Pod通信3、flannel的三种转发数据…

作者头像 李华
网站建设 2026/6/28 18:36:20

护眼灯品牌排行第一名是谁?权威第一护眼灯品牌曝光,护眼超安心

儿童青少年近视率居高不下&#xff0c;劣质台灯更是雪上加霜&#xff01;权威数据显示&#xff0c;孩子每天被劣质光线照射1小时&#xff0c;半年内近视度数就可能明显上涨。可护眼台灯市场鱼龙混杂&#xff0c;虚假宣传、参数造假层出不穷&#xff0c;家长想给孩子选到靠谱的灯…

作者头像 李华
网站建设 2026/7/10 23:25:13

架构演进过程

一、单体架构优点&#xff1a; 简单&#xff1a;开发部署都很方便&#xff0c;小型项目首选 缺点&#xff1a; 项目启动慢可靠性差可伸缩性差扩展性和可维护性差性能低 二、垂直架构垂直架构是指将单体架构中的多个模块拆分为多个独立的项目。形成多个独立的单体架构。 垂直架构…

作者头像 李华