Codeforces Round #614 (Div. 2) D - Aroma's Search
Posted stelayuri
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #614 (Div. 2) D - Aroma's Search相关的知识,希望对你有一定的参考价值。
原题题面:https://codeforces.com/contest/1293/problem/D
题目大意:
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以上的点
记录每次枚举可以到达的点的个数,取最大输出
1 /* 2 Written By. StelaYuri 3 On 2020/01/19 4 */ 5 #include<bits/stdc++.h> 6 using namespace std; 7 typedef long long ll; 8 const ll e16=1e16; 9 ll x[150],y[150]; 10 void solve(){ 11 ll x0,y0,ax,ay,bx,by,xs,ys,t; 12 cin>>x0>>y0>>ax>>ay>>bx>>by>>xs>>ys>>t; 13 x[0]=x0; 14 y[0]=y0; 15 ll i,j,mxn,ans,ansd,td; 16 for(i=1;x[i-1]<=e16&&y[i-1]<=e16;i++){ 17 x[i]=x[i-1]*ax+bx; 18 y[i]=y[i-1]*ay+by; 19 } 20 mxn=i-1; 21 ans=0; 22 for(i=0;i<=mxn;i++){ 23 ansd=0; 24 td=t; 25 if((td=td-abs(xs-x[i])-abs(ys-y[i]))>=0) 26 ansd++; 27 for(j=i-1;j>=0&&td>0;j--){ 28 if((td=td-abs(x[j+1]-x[j])-abs(y[j+1]-y[j]))>=0) 29 ansd++; 30 } 31 if(td>0&&(td=td-abs(x[i+1]-x[0])-abs(y[i+1]-y[0]))>=0) 32 ansd++; 33 for(j=i+2;j<=mxn&&td>0;j++){ 34 if((td=td-abs(x[j]-x[j-1])-abs(y[j]-y[j-1]))>=0) 35 ansd++; 36 } 37 ans=max(ans,ansd); 38 } 39 cout<<ans<<endl; 40 } 41 int main(){ 42 ios::sync_with_stdio(0); 43 cin.tie(0);cout.tie(0); 44 solve(); 45 46 return 0; 47 }
以上是关于Codeforces Round #614 (Div. 2) D - Aroma's Search的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)