题目大意:
Aroma想要找数据
第0个数据再x0,y0这个点
其后所有数据所在的坐标点满足
x[i]=x[i-1]*ax+bx
y[i]=y[i-1]*ay+by
Aroma一开始在点(xs,ys),她最多只能走t步
两点间的距离用Δx+Δy表示
问Aroma最多能走到多少个点(找到多少个数据)?
解题思路:
因为ax和ay是大于等于2的整数
所以序号越大点越离散
所以最多只有log1e16约等于60个点
贪心枚举第一步要去的点i,然后从i开始先往点的序号小的点走 i-1, i-2 ,... 0
如果步数t还有剩余再考虑i+1以上的点
记录每次枚举可以到达的点的个数,取最大输出
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll e16=1e16; ll x[150],y[150]; void solve(){ ll x0,y0,ax,ay,bx,by,xs,ys,t; cin>>x0>>y0>>ax>>ay>>bx>>by>>xs>>ys>>t; x[0]=x0; y[0]=y0; ll i,j,mxn,ans,ansd,td; for(i=1;x[i-1]<=e16&&y[i-1]<=e16;i++){ x[i]=x[i-1]*ax+bx; y[i]=y[i-1]*ay+by; } mxn=i-1; ans=0; for(i=0;i<=mxn;i++){ ansd=0; td=t; if((td=td-abs(xs-x[i])-abs(ys-y[i]))>=0) ansd++; for(j=i-1;j>=0&&td>0;j--){ if((td=td-abs(x[j+1]-x[j])-abs(y[j+1]-y[j]))>=0) ansd++; } if(td>0&&(td=td-abs(x[i+1]-x[0])-abs(y[i+1]-y[0]))>=0) ansd++; for(j=i+2;j<=mxn&&td>0;j++){ if((td=td-abs(x[j]-x[j-1])-abs(y[j]-y[j-1]))>=0) ansd++; } ans=max(ans,ansd); } cout<<ans<<endl; } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); solve(); return 0; }