2018年ACM-ICPC青岛区域赛 E题 Plants vs. Zombies

该博客介绍了2018年ACM-ICPC青岛区域赛中E题的详细解析。题目涉及一个机器人在花园中浇水植物的问题,目标是寻找使花园防御能力最高的行动路线。博主通过二分搜索法解决这个问题,讨论了如何判断机器人在给定步数内能否使每株植物的成长度达到特定值,并给出了具体的算法思路和实现细节。

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

题目连接-浙大oj
题目
Sample Input
2
4 8
3 2 6 6
3 9
10 10 1
Sample Output
6
4
提示
题意:
T 组测试用例
n株植物 机器人步数m(浇水次数)
机器人沿直线移动(向东或向西):屋内-植物1-植物2…-植物n-花园外
每移动一次浇水一次
每株植物增长速度不同ai,植物每次被浇水增长ai
花园防御能力取决于成长度最低的植物
找出使花园防御能力最高的机器人行动路线

例:4 8
3 2 6 6
路线:E(东),E,W(西),E,E,W,E,E
浇水后植物成长度6,6,12,6
防御力为6
思路:
最大化最小值 用二分搜索

  1. 条件c(x):m步内使每株植物成长度至少为x
  2. x区间初始化[0,1e17]
  3. 当能满足条件c(x)时提高下界l=mid+1 即可找到最大的最小值

条件c(x)的判断函数实现:

  1. 最小值最小为0 符合 返回true
  2. 每株实现最小值需要浇几次水 num=(m+a[i]-1)/a[i]
  3. 每个点实现所需步数的方法为向下一点移动再回来(两点见反复横跳)直到实现指标(最小值)
  4. b[i]存储机器人在每个点的步数
  5. 每个点步数的组成为与前一个点横跳的步数+与下一点的横跳步数
  6. 最小值不为0时 即所有植物都浇过水 步数最小为1 b[i]++
  7. b[i]先存入前一点横跳的步数,再存入基础步数+1,与最小步数比较,不足则改为最小步数,将差值(与下一点的横跳步数)存入下一点
  8. 最小值不为0时 最后一个点(花园外)步数可能为0 加判断 if(i==N-1&&b[i]>=num) 未移动到最后一点 b[i]可以不+1
#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
const int MAXN = 100100;

int N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值