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 选讲

Codeforces Round #614 (Div. 2)

Codeforces Round #614 (Div. 2)

Codeforces Round #614 (Div. 2) A-E简要题解