题意:给定初始的坐标(x0,y0),后面的(x1,y1),(x2,y2)…(xn,yn)将有这个递推式求出(axXi-1+bx,ayYi-1+by)得出,这些坐标表示作者想吃的坐标,作者一开始坐标在(xs,ys),每次上下左右移动都会花费1s,问在t秒内作者能吃的点的做大数目。
思路:其实胆子大一点暴力就行了。。。因为这个递推式可以得出可以吃的点是连续的,而且数目也不会很多,直接递推求就行了,至于吃哪些点的话暴力一个个枚举求就行了。
#include <bits/stdc++.h>
const int maxn=1e5+1;
using namespace std;
typedef long long ll;
const ll inf=1e16+1;
int main()
{
ll x[maxn],y[maxn],ax,bx,ay,by,xs,ys,cnt=0,tot;
int ans=0;
scanf("%lld %lld %lld %lld %lld %lld",&x[0],&y[0],&ax,&ay,&bx,&by);
while(x[cnt]<inf&&y[cnt]<inf)
{
cnt++;
x[cnt]=ax*x[cnt-1]+bx;
y[cnt]=ay*y[cnt-1]+by;
}
scanf("%lld %lld %lld",&xs,&ys,&tot);
for(int i=0;i<=cnt;++i)
for(int j=i;j<=cnt;++j)
{
ll t=min(abs(xs-x[i])+abs(ys-y[i]),abs(xs-x[j])+abs(ys-y[j]));
t+=(abs(x[j]-x[i])+abs(y[j]-y[i]));
if(t<=tot) ans=max(ans,(j-i+1));
}
printf("%d\n",ans);
}