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

Codeforces Round #378 (Div. 2)

时间:2020-02-08 00:10:49      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:一起   void   pair   int   跳过   com   字母   print   force   

题目链接:https://codeforces.com/contest/733

A - Grasshopper And the String

题意:有个虫子,要跳过一个长度为 \(n\) 的字符串(从 \(0\) 跳到 \(n+1\) ),只能停在元音字母处。求最短的跳跃距离。

题解:求前后相邻两个停留位置的差的最大值。

char s[200005];

void test_case() {
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    int lst = 0, maxlen = 0;
    for(int i = 1; i <= n; ++i) {
        if(s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U' || s[i] == 'Y') {
            maxlen = max(maxlen, i - lst);
            lst = i;
        }
    }
    maxlen = max(maxlen, n + 1 - lst);
    printf("%d\n", maxlen);
}

B - Parade

题意:阅兵,第 \(i\) 行的士兵有 \(l_i\) 个喜欢先出左脚,有 \(r_i\) 个喜欢先出右脚。定义阅兵的整齐度为 \(|L-R|\) ,其中 \(L=\sum_{i=1}^{n}l_i\)
\(R\) 同理。现在可以调整至多一个行的士兵,让他们左右颠倒,求最大的整齐度。

题解:枚举这个行。

int n;
int l[100005];
int r[100005];

void test_case() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d%d", &l[i], &r[i]);
    ll sumL = 0, sumR = 0;
    for(int i = 1; i <= n; ++i) {
        sumL += l[i];
        sumR += r[i];
    }
    int ans = 0;
    ll cur = abs(sumL - sumR);
    ll tsumL = sumL, tsumR = sumR;
    for(int i = 1; i <= n; ++i) {
        sumL -= l[i];
        sumR -= r[i];
        sumL += r[i];
        sumR += l[i];
        ll tmp = abs(sumL - sumR);
        if(tmp > cur) {
            ans = i;
            cur = tmp;
        }
        sumL = tsumL;
        sumR = tsumR;
    }
    printf("%d\n", ans);
}

D - Kostya the Sculptor

题意:找至多两块可以完全贴合(某个面完全一致)的长方体,贴在一起,然后切一个最大的球出来。

题解:考虑要切的是球体,所以受限制的是最短边。所以可以把边排序,把长的两条边作为ID,然后尝试把短边贴在一起,这样有可能会改进答案。所以选个数据结构map就可以。甚至连常数都可以省掉,定义一个struct的前两维是长边,然后按照长边排序,可以贴合的就会排在附近,找出每种前两维相等的struct中最大的两个进行贴合。

int a[3];
map<pair<int, int>, pair<int, int> > M;

void test_case() {
    int n;
    scanf("%d", &n);
    int ansL = 0;
    int k = 0;
    int k1 = 0, k2 = 0;
    for(int i = 1; i <= n; ++i) {
        scanf("%d%d%d", &a[0], &a[1], &a[2]);
        sort(a, a + 3);
        pii &tL = M[{a[1], a[2]}];
        if(tL.first == 0) {
            if(a[0] > ansL) {
                ansL = a[0];
                k = 1;
                k1 = i;
            }
            tL = {a[0], i};
        } else {
            int curL = min(a[1], a[0] + tL.first);
            if(curL > ansL) {
                ansL = curL;
                k = 2;
                k1 = i;
                k2 = tL.second;
            }
            if(a[0] > tL.first)
                tL = {a[0], i};
        }
    }
    printf("%d\n", k);
    if(k == 1)
        printf("%d\n", k1);
    else
        printf("%d %d\n", k1, k2);
}

Codeforces Round #378 (Div. 2)

标签:一起   void   pair   int   跳过   com   字母   print   force   

原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12274986.html

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