Codeforces Edu60 题解报告

题目

http://codeforces.com/contest/1117

A

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int a[n];
    int mx = 0;
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        if(a[i] > mx)
        {
            mx = a[i];
        }
    }

    int cnt = 0;
    int ans = 0;
    for(int i = 0; i < n; i++)
    {
        if(mx == a[i])
        {
            cnt++;
            if(cnt > ans)
            {
                ans = cnt;
            }
        }
        else
        {
            cnt = 0;
        }
    }

    cout << ans << endl;

    return 0;
}

B

#include<bits/stdc++.h>
using namespace std;

long long c,n,m,k,i;

int main()
{
    cin>>n>>m>>k;
    int a[n];
    
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    
    sort(a,a+n);
    
    c=a[n-1]-a[n-2];
    cout<<m*a[n-1]-(m/(k+1))*c;
    
    return  0;
}

C

分析:
本题可将风吹动船的运动轨迹和船本身的运动轨迹分开来看。以样例1为例。

  1. 假如经过的时间为10天,则风会将船吹到(0,10)的位置。(0,10)与终点(4,6)的曼哈顿距离(即横方向的距离加上竖方向的距离)为|4 – 0| + |6 – 10| = 8。现在考虑船的运动轨迹,在10天的时间内,船本身可以运动的最大的曼哈顿的距离是10。8 < 10,所以船只需要运动8天就可以到达终点,剩余两天的时间船可以保持不变。
  2. 假如经过的时间为5天,则风会将船吹到(0,5)的位置。(0,5)与终点(4,6)的曼哈顿距离为|4 – 0| + |6 – 5| = 5。现在考虑船的运动轨迹,在5天的时间内,船本身可以运动的最大的曼哈顿的距离是5。所以船运动5天后恰巧可以到达终点。
  3. 假如经过的时间为2天,则风会将船吹到(0,2)的位置。(0,2)与终点(4,6)的曼哈顿距离为|4 – 0| + |6 – 2| = 8。现在考虑船的运动轨迹,在2天的时间内,船本身可以运动的最大的曼哈顿的距离是2。所以2天的时间不可能到达终点。

通过上面三种情况可以看出,答案一定不是2天,也一定不是10天。但是咱们无法确定5天符合不符合题意。假如4天船能到达终点,则5天不是最少的时间。如果4天船无法到达终点,则5天是最少的时间,即5天为最终的答案。

如何确定最小的时间呢?可以使用二分法。考虑到本题的数据很大,需要初始化一个很大的数right = 1e18(即10^18)天,并初始化left = 0天。取mid = (left + right) / 2。如果mid天内船能到达终点,则把right更新为mid,这样就能减少下一次mid的值。如果mid天内船不能到达终点,则把left更新为mid,这样就能增加下一次mid的值。这样最终就能得到最小的天数。

#include <bits/stdc++.h>

using namespace std;

#define x first
#define y second

const int N = 100009;

pair<int, int> startP, endP;
int n;
string wind;

string dir = "UDLR";    //四个方向:0对应U, 1对应D,2对应L,3对应R
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};

pair<int, int> d[N];

int main()
{
//    freopen("test.in", "r", stdin);
//    freopen("test.out", "w", stdout);

    cin >> startP.x >> startP.y >> endP.x >> endP.y;
    cin >> n >> wind;

    for(int i = 0; i < n; ++i)
    {
        int id = -1;
        for(int j = 0; j < 4; ++j)
        {
            if(dir[j] == wind[i])
            {
                id = j;
            }
        }
        assert(id != -1);
        d[i + 1] = make_pair(d[i].x + dx[id], d[i].y + dy[id]);
    }

    long long l = 0, r = 1e18;
    while(r - l > 1)
    {
        long long mid = (l + r) / 2;
        long long cnt = mid / n, rem = mid % n;
        long long x = startP.x + d[rem].x + cnt *  1LL * d[n].x;
        long long y = startP.y + d[rem].y + cnt *  1LL * d[n].y;
        long long dist = abs(x - endP.x) + abs(y - endP.y);
        if(dist <= mid)
        {
            r = mid;
        }
        else
        {
            l = mid;
        }
    }

    if(r > 5e17)
    {
        r = -1;
    }

    cout << r << endl;

    return 0;
}

TopCoder & Codeforces & AtCoder交流QQ群:648202993
中小学信息学竞赛咨询请加微信307591841

《Codeforces Edu60 题解报告》 信息学竞赛公众号.jpg

    原文作者:海天一树X
    原文地址: https://www.jianshu.com/p/46093ecb954c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞