• Codeforces 1117C Magic Ship (二分)


    题意:

    船在一个坐标,目的地在一个坐标,每天会有一个风向将船刮一个单位,船也可以移动一个单位或不动,问最少几天可以到目的地

    思路:

    二分天数,对于第k天

    可以分解成船先被吹了k天,到达坐标(x1+sumx[k%n]+k/n*sumx[n], y1+sumy[k%n]+k/n*sumy[n])

    然后船在无风的情况下自己走k天是不是能到目的地就行了

    注意二分的上限,如果能走到的情况下船可能每轮风只能移动一个有效单位,所以上限应该是1e9*1e5

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    //#include<cmath>
    #include<cstring>
    #include<string>
    #include<stack>
    #include<queue>
    #include<deque>
    #include<set>
    #include<vector>
    #include<map>
    #include<functional>
        
    #define fst first
    #define sc second
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    #define lson l,mid,root<<1
    #define rson mid+1,r,root<<1|1
    #define lc root<<1
    #define rc root<<1|1
    #define lowbit(x) ((x)&(-x)) 
    
    using namespace std;
    
    typedef double db;
    typedef long double ldb;
    typedef long long ll;
    typedef long long LL;
    typedef unsigned long long ull;
    typedef pair<int,int> PI;
    typedef pair<ll,ll> PLL;
    
    const db eps = 1e-6;
    const int mod = 998244353;
    const int maxn = 2e6+100;
    const int maxm = 2e6+100;
    const int inf = 0x3f3f3f3f;
    //const db pi = acos(-1.0);
    
    
    ll x1, x2;
    ll y1, y2;
    ll n;
    char a[maxn];
    ll sumx[maxn];
    ll sumy[maxn];
    bool ck(ll k){
        ll x = x1;
        ll y = y1;
        x += k/n*sumx[n] + sumx[k%n];
        y += k/n*sumy[n] + sumy[k%n];
        ll d = abs(x-x2)+abs(y-y2);
        if(d<=k)return true;
        return false;
    }
    int main() {
        scanf("%lld %lld", &x1,&y1);
        scanf("%lld %lld", &x2,&y2);
        scanf("%lld", &n);
        scanf("%s",a+1);
        ll l = 0, r = 1e15;
        for(int i = 1; i <= n; i++){
            sumx[i] = sumx[i-1];
            sumy[i] = sumy[i-1];
            if(a[i]=='U'){
                sumy[i]++;
            }
            if(a[i]=='D'){
                sumy[i]--;
            }
            if(a[i]=='L'){
                sumx[i]--;
            }
            if(a[i]=='R'){
                sumx[i]++;
            }
        }
        ll ans = -1;
        while(l <= r){
            ll mid = (l+r)/2;
            //printf("%lld %lld %lld
    ", l, r, mid);
            if(ck(mid)){
                r = mid-1;
                ans = mid;
            }
            else{
                l = mid+1;
            }
        }
        printf("%lld", ans);
        return 0;
    
    }
    /*
    10
    59 -17 5 67 87 50 -71 54 27 -10
    
     */
  • 相关阅读:
    IE各版本CSS Hack(兼容性处理)语法速查表
    如何使用Three.js加载obj和mtl文件
    C# windows服务制作(包括安装及卸载)
    初识 Sql Server存储过程
    初始Bootstrap
    微软语言包实现汉字转拼音
    Autocomplete 自动补全(Webform实战篇)
    Npoi导出Excel 实战篇(Webform)
    Linq 知识回顾
    常用正则用法汇总
  • 原文地址:https://www.cnblogs.com/wrjlinkkkkkk/p/10561174.html
Copyright © 2020-2023  润新知