当前位置: 首页 > 工具软件 > Aroma > 使用案例 >

D. Aroma‘s Search(思维)

潘志国
2023-12-01

Problem - 1293D - Codeforces

KIVΛ & Nikki Simmons - Perspectives
有了新的身体,我们的偶像Aroma White(或者我们应该叫她Kaori Minamiya?)开始通过OS空间揭开她失去的过去。

这个空间可以被认为是一个二维平面,有无限多的数据节点,从0开始索引,其坐标定义如下。

第0个节点的坐标是(x0,y0)
对于i>0,第i个节点的坐标是(ax⋅xi-1+bx,ay⋅yi-1+by)
最初,Aroma站在(xs,ys)点上。她最多可以在OS空间停留t秒,因为过了这个时间,她就必须翘头回到现实世界。她不需要返回到入口点(xs,ys)来翘辫子回家。

在操作系统空间内,Aroma可以做以下动作。

从(x,y)点开始,Aroma可以移动到以下其中一个点:(x-1,y), (x+1,y), (x,y-1) 或 (x,y+1)。这个动作需要1秒钟。
如果在香香呆的地方有一个数据节点,她可以收集它。我们可以假设这个动作需要0秒。当然,每个数据节点最多可以被收集一次。
Aroma想在返回之前尽可能多地收集数据。你能帮她计算一下,她在t秒内最多可以收集多少个数据节点?

输入
第一行包含整数x0, y0, ax, ay, bx, by (1≤x0,y0≤1016, 2≤ax,ay≤100, 0≤bx,by≤1016),它们定义数据节点的坐标。

第二行包含整数xs, ys, t (1≤xs,ys,t≤1016) - 初始Aroma的坐标和可用的时间量。

输出
打印一个整数--Aroma在t秒内能收集的最大数据节点数。

例子
inputCopy
1 1 2 3 1 0
2 4 20
outputCopy
3
输入复制
1 1 2 3 1 0
15 27 26
输出拷贝
2
输入复制
1 1 2 3 1 0
2 2 1
输出拷贝
0
注意
在所有三个例子中,前5个数据节点的坐标是(1,1), (3,3), (7,9), (15,27)和(31,81)(记住,节点的编号是从0开始的)。

在第一个例子中,收集3个节点的最佳路线如下。

到坐标(3,3)处,收集第1个节点。这需要|3-2|+|3-4|=2秒。
到坐标(1,1)处,收集第0个节点。这需要|1-3|+|1-3|=4秒。
到坐标(7,9)处,收集第2个节点。这需要|7-1|+|9-1|=14秒。
在第二个例子中,收集2个节点的最佳路线如下。

收集第3个节点。这不需要秒。
到坐标(7,9)处,收集第2个节点。这需要|15-7|+|27-9|=26秒。
在第三个例子中,Aroma不能收集任何节点。她应该适当休息,而不是像这样冲进操作系统空间。

题意:给你一组的点

(ax⋅xi−1+bx,ay⋅yi−1+by),求初始点出发t秒内可以经历多少点

题解:从数据范围入手,t<=1e16,又因为ax<=100.bx<=10且都>=2,所以顶多60多个点就结束了,剩下的一定大于1e16

其次以上数据均为正数,所以越下一个点越在右上

根据曼哈顿距离

d[i,i+1] +d[i+1,i+2] = d[i,i+2]

所以枚举区间起点,终点即可

#include<iostream>
#include<cmath>
using namespace std;
long long a[100050];
long long b[100050];
int main()
{
	long long x0,y0,ax,ay,bx,by,xs,ys,t;
	cin>>x0>>y0>>ax>>ay>>bx>>by>>xs>>ys>>t;
	int s = 0;
	a[0] = x0;
	b[0] = y0;
	while(1)
	{
		s++;
		a[s] = a[s-1]*ax +bx;
		b[s] = b[s-1]*ay +by;
		if(a[s]-xs>t||b[s]-ys>t)
		break;
	}
	int ans = 0;
	for(int i = 0;i < s;i++)
	{
		for(int j = 0;j < s;j++)
		{
			if(fabs(a[i]-xs)+fabs(b[i]-ys)+fabs(a[j]-a[i])+fabs(b[j]-b[i])<=t)
			{
				ans = max(ans,abs(i-j)+1);
				
			}
		}
	}
	cout<<ans;
}

 类似资料: