• Codeforces Round #614 (Div. 2)


    A. ConneR and the A.R.C. Markland-N

    题目链接:https://codeforces.com/contest/1293/problem/A

    题意:

    有一个长为 n 的楼层,其中有 k 个楼层没有餐厅 ,你现在在 s 层,问你最少走多少个楼层可以到达餐厅吃饭

    分析:

    因为 k 只有 1000,所以直接往 s 层上下方找(当找到 0 或者 n + 1 时说明这个方向没有答案)

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    map<ll , int>ha;
    int main()
    {
        int t;
        cin >> t;
        while(t --)
        {
            ha.clear();
            ll n , s , k ;
            cin >> n >> s >> k;
            for(int i = 1 ; i <= k ; i ++)
            {
                int x;
                cin >> x;
                ha[x] = 1;
            } 
            ll now = s , ans = (0x3f3f3f3f3f3fll);
            while(ha[now])
            now ++ ;
            if(now != n + 1)
            ans = now - s;
            now = s;
            while(ha[now])
            now --;
            if(now != 0)
            ans = min(ans , s - now);
            cout << ans << '
    ';
        }
        return 0;
    }
    View Code

    B. JOE is on TV!    

    题目链接:https://codeforces.com/contest/1293/problem/B

    题意:

    当敌人总数为 i 时,如果它犯了 j(j  <= i) 个错误,则你可以获得 $dfrac {j}{i}$ 的报酬,同时敌人数量会减少 j 。现有n个敌人,问你能获得的最大报酬为多少

    分析:

    (应该很很多人都是盲猜正解,比如我)

    记敌人总数为 N , 若此时你要让它犯 T 个错误,则你获得的报酬为$dfrac {T}{N}$ , 敌人总数变为 N - T。

    但若你从 N 开始每次让敌人犯1个错误直到敌人总数为 N - T , 那么的获得的报酬就为 $dfrac {1}{N}+dfrac {1}{N-1}+ldots +dfrac {1}{N-T+1}$ 

    然后可以证得 $dfrac {T}{N}leq dfrac {1}{N}+dfrac {1}{N-1}+ldots +dfrac {1}{N-T+1}$ (怎么证就不细说了)

    所以每次只让敌人犯一个错误获得的报酬会是最大的

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n ;
        double  ans = 0;
        cin >> n;
        for(int i = 1 ; i <= n ; i ++)
            ans += 1.0 / i;
        cout << ans << '
    ';
        return 0;
    }
    View Code

    C. NEKO's Maze Game

    题目链接:https://codeforces.com/contest/1293/problem/C

    题意:

    有一个 2 * N 的地图,开始每个位置都是可以走的。然后地图会改变 q 次,每次改变会使一个位置改变状态(可走→不可走,不可走→可走)

    问每次改变完地图后是否能从(1 , 1)走到(2 , n)

    分析:

    因为地图只有两行,所以无法到达终点的情况只有这些:当前位置不可走,且该位置上、下、左上、左下、右上、右下不能走,我们用 cnt 统计这些情况的总个数

    那么当 cnt = 0 时,则可以到达,否则不能

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int N = 2e5 + 10;
    ll mat[10][N];
    int main()
    {
        ll n , q , cnt = 0;
        cin >> n >> q;
        for(int i = 1 ; i <= q ; i ++)
        {
            ll x, y, z = 1;
            cin >> x >> y;
            if(x == 1) z = 2;
            if (mat[x][y])
                cnt = cnt - mat[z][y - 1] - mat[z][y] - mat[z][y + 1];
            else
                cnt = cnt + mat[z][y - 1] + mat[z][y] + mat[z][y + 1];
            if (!cnt)
                cout << "Yes" << '
    ';
            else
                cout << "No" << '
    ';
            mat[x][y] ^= 1;
        }
        return 0;
    }
    View Code

    D. Aroma's Search

    题目链接:https://codeforces.com/contest/1293/problem/D

    题意:

    有无数的点,第1个点的坐标为 (X1 , Y1) , 第2个点的坐标为 (X1 * ax + bx , Y1 * bx + by) , 第三个点的坐标为(X2 * ax + bx , Y2 * ay + by) ......

    你的初始位置为(SX , SY) , 你每秒可以向上、向下、向左、向右移动一格。问在 T 秒内,你最多可以到达几个点

    分析:

    题目给的 SX、SY、T 最大可取值都为 1e16 , 且点的个数是无限的,乍一看好像会有很多种情况,但因为ax , ay 都是大于等于2的,所以横坐标和纵坐标的增长速率都大于等于 2 的幂次

    而除第一个点外当横坐标或纵坐标大于 1e17 时,这个点就肯定用不上了(因为此时这个点到距离它最近的点所用的时间必然 > T),那么算下来可以使用的点顶多也就60个.

    所以我们可以枚举一个起点和终点(枚举的起点和终点可以相同)

    若我们到达起点 i 所用的时间 + 从 i 到达终点 j 所用的时间小于等于T,则我们可以到达的点的个数为 $absleft( i-j ight) +1$ (不理解可以把顶点的分布情况画出来),然后更新一下 ans

    // 比赛时用 dfs 枚举的复杂度为O( n ^ 3 )  , 虽然不会超时但是写的比较乱,所以赛后看tourist代码改了一份精简版的

    #include<bits/stdc++.h>
    using namespace std;
    #define fi first
    #define se second
    #define ll long long
    const int N = 2e5 + 10;
    const ll MAXN = 1e17;
    vector<pair<ll , ll> >vec;
    ll dist(ll x1 , ll y1 , ll x2 , ll y2)
    {
        return abs(x1 - x2) + abs(y1 - y2);
    }
    int main()
    {
        ll x , y , ax , ay , bx , by;
        ll sx , sy , t;
        cin >> x >> y >> ax >> ay >> bx >> by;
        cin >> sx >> sy >> t;
        vec.push_back(make_pair(x , y));
        while(1)
        {
            ll xx , yy , len = vec.size() - 1;
                if(vec[len].fi * 2 + bx < MAXN && vec[len].se * 2 + by < MAXN)
                    xx = vec[len].fi * ax + bx , yy = vec[len].se * ay + by;
                else break;
            vec.push_back(make_pair(xx , yy));
        }
        int ans = 0;
        for(int i = 0 ; i < vec.size() ; i ++)
            for(int j = 0 ; j < vec.size() ; j ++)
                if(dist(sx , sy , vec[i].fi , vec[i].se) + dist(vec[i].fi , vec[i].se , vec[j].fi , vec[j].se) <= t)
                    ans = max(ans , abs(i - j) + 1);
        cout << ans << '
    ';
        return 0;
    }
    View Code

    E. Xenon's Attack on the Gangs

    题目链接:https://codeforces.com/contest/1293/problem/E

    待补

    凡所不能将我击倒的,都将使我更加强大
  • 相关阅读:
    决策模型(一):不确定型决策法
    Redis系列(二):Redis的数据类型及命令操作
    Redis系列(一):Redis的简介与安装
    java中传值方式的个人理解
    理解主从设备模式(Master-Slave)
    基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)
    基于ubuntu16.04快速构建Hyperledger Fabric网络
    fastjson 的使用总结
    简析淘宝网的六大质量属性
    软件架构师如何工作
  • 原文地址:https://www.cnblogs.com/StarRoadTang/p/12216456.html
Copyright © 2020-2023  润新知