zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Zabbix 单位换算
    Confluence6.9配置邮件服务器
    Linux内核基础优化
    Nginx跨域问题
    ssh远程登录过程中卡住
    postfix无法启动问题
    mysql-配置文件详解
    Mongodb-副本集部署
    Mongodb-安全配置优化
    Mongodb-简单部署
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12216186.html
Copyright © 2011-2022 走看看