码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 55 题解

时间:2018-11-30 20:50:38      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:round   scanf   book   一个   bool   \n   length   nal   main   

题解 CF1082A 【Vasya and Book】

史上最难A题,没有之一

从题意可以看出,翻到目标页只有三种办法

  • 先从\(x\)\(1\),再从\(1\)\(y\)

  • 先从\(x\)\(n\),再从\(n\)\(y\)

  • 直接从\(x\)\(y\)

三种的必要条件分别是

  • \((y-1)\mod d \equiv 0\)

  • \((n-y)\mod d \equiv 0\)

  • \(|x-y|\mod d \equiv 0\)

所以如果上面三种都不满足的话就输出\(-1\)

不然就取最小的输出

# include <bits/stdc++.h>

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, x, y, d;
        scanf("%d%d%d%d", &n, &x, &y, &d);
        int ans = 0x7f7f7f7f;
        if(abs(x - y) % d == 0)
            ans = abs(x - y) / d;
        if((y - 1) % d == 0)
            ans = std::min(ans, (x - 1) / d + bool((x - 1) % d) + (y - 1) / d);
        if ((n - y) % d == 0)
            ans = std::min(ans, (n - x) / d + bool((n - x) % d) + (n - y) / d);
        if(ans == 0x7f7f7f7f)
        {
            printf("-1\n");
            continue;
        }
        printf("%d\n", ans);
    }
    return 0;
}

题解 CF1082B 【Vova and Trophies】

\(B\)\(A\)水qwq

这题,对每一个‘‘\(G\)‘‘,求它这一块的左边界和右边界

然后对于每一个‘‘\(S\)‘‘,求一下他左边那块的大小,右边那块的大小,再判断一下他能不能把两块连在一起,不能就取大的那块,做完了

#include <bits/stdc++.h>

using std::string;

const int MaxN = 100010;

int a[MaxN];
int l[MaxN], r[MaxN];

int main()
{
    int n;
    string s;
    scanf("%d", &n);
    std::cin >> s;
    int len = s.length();
    int sum = 0, ans = 0;
    for (int i = 0; i < len; i++)
        a[i + 1] = s[i] == ‘S‘ ? 0 : 1, sum += a[i + 1];
    if (sum == 0)
        return printf("0") * 0;
    if (sum == n)
        return printf("%d\n", n) * 0;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 1 && a[i - 1] == 1)
            l[i] = l[i - 1];
        else
            l[i] = i;
    }
    for (int i = n; i >= 1; i--)
    {
        if (a[i] == 1 && a[i + 1] == 1)
            r[i] = r[i + 1];
        else
            r[i] = i;
    }
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 0)
        {
            int tmp = 0;
            if (a[i - 1])
                tmp += r[i - 1] - l[i - 1] + 1;
            if (a[i + 1])
                tmp += r[i + 1] - l[i + 1] + 1;
            if(tmp == sum)
                ans = std::max(ans, tmp);
            if (tmp < sum)
                ans = std::max(ans, tmp + 1);
            if (a[i - 1] && r[i - 1] - l[i - 1] + 1 < sum)
                ans = std::max(r[i - 1] - l[i - 1] + 2, ans);
            if (a[i + 1] && r[i + 1] - l[i + 1] + 1 < sum)
                ans = std::max(r[i + 1] - l[i + 1] + 2, ans);
            
        }
    }
    printf("%d\n", ans);
    return 0;
}

Educational Codeforces Round 55 题解

标签:round   scanf   book   一个   bool   \n   length   nal   main   

原文地址:https://www.cnblogs.com/little-sun0331/p/10046308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!