Codeforces 1292B/1293D

题目大意:

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;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12216186.html