CF1292B(思维)

Aroma's Search

题目描述

这个空间可以看作是一个二维平面,在其内部有着无限多的数据点,从 0 开始标号,它们的坐标定义如下:

  • 0 个点的坐标为 (x0,y0)
  • 对于 i>0,第 i 个点的坐标为 (xi,yi)=(axxi1+bx,ayyi1+by)

初始时 Aroma 的位置为 (xs,ys)。她只能留在 OS 空间中最多 t 秒,她不需要返回初始位置 (xs,ys) 也能传送回家。

在 OS 空间中,Aroma 可以做如下操作:

  • 在点 (x,y) 上时,Aroma 可以移动到这四个点之一:(x1,y),(x+1,y),(x,y1),(x,y+1)。这个操作需要耗费 1 秒。
  • 如果 Aroma 当前的位置上有数据点,她可以收集它。我们可以假定这个操作耗费 0 秒。当然,每个数据点只能被收集一次。

计算在 t 秒内最多能收集的数据点的个数吗?

思路:

  对于点集 {(xi,yj)|xi=xi1×ax+bx,yi=yi1×ay+by}我们可以写出这些点x,y坐标的通项公式: xn=x0×axn+bx×(axn1+axn2++ax2+ax1+ax0), 可以发现bx乘的那一部分是一个等比数列,那么最终的通项公式就是xn=x0×axn+axn1ax1. 因为axn是一个指数函数,当n增大的时候,点在二维平面上就会越来越稀疏,所以想要尽可能的收集多的数据点,就应该先向P0方向收集再向p0Pn方向收集, 但是起始点应该先向哪个点移动并不知道,所以需要枚举第一个走向的点,然后按照PiP0Pn这个原则走。

int n = 0; i64 a, b, c, d, sx, sy, t; std::cin >> x[0] >> y[0] >> a >> c >> b >> d >> sx >> sy >> t; auto dis = [&](i64 x1, i64 y1, i64 x2, i64 y2) -> i64 { return std::llabs(x1 - x2) + std::llabs(y1 - y2); }; while(++n) { x[n] = x[n - 1] * a + b; y[n] = y[n - 1] * c + d; if (x[n] > sx && y[n] > sy && dis(sx, sy, x[n], y[n]) > t) break; } int ans = 0; for (int i = 0; i <= n; i++) { int res = 0; i64 now = t; if (now >= dis(x[i], y[i], sx, sy)) res++, now -= dis(x[i], y[i], sx, sy); else continue; for (int j = i - 1; j >= 0; j--) { if (now >= dis(x[j], y[j], x[j + 1], y[j + 1])) res++, now -= dis(x[j], y[j], x[j + 1], y[j + 1]); else { ans = std::max(ans, res); pos = i; break; } } for (int j = 1; j <= n; j++) { if (now >= dis(x[j], y[j], x[j - 1], y[j - 1])) res += j > i, now -= dis(x[j], y[j], x[j - 1], y[j - 1]); else {ans = std::max(ans, res); break;} } } std::cout << ans << "\n";

__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16733866.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示