Educational Codeforces Round 168 (Rated for Div. 2)

被b坑了

A题:Strong Password

题意

Monocarp的密码强度在于打字所耗的时间多少,如果当前字符与前一个字符相同,需要1s,否则需要2s,你现在可以在任意位置插入一个任意字符,请你帮忙构造一个最强密码

思路

贪心,最好的方式是将两个连续的给拆开,这样就能使得增加的最多,为3(2+2-1)

否则就直接在最前面加一个与第一个不同的,加2

代码

inline void solve() {
     string s; cin >> s;
     bool ok = false;
     for (int i = 1; i < s.size(); i ++ ) {
        if (s[i] == s[i - 1]) {
            s.insert(i, s[i] == 'a' ? "b" : "a");
            ok = true;
            break;
        }
     }
     if (!ok) s = (s[0] == 'a' ? 'b' : 'a') + s;
     cout << s << endl;
	 return;
}

B题:Make Three Regions 

题意

给定一个2xn的网格,网格上有若干个阻塞单元格,你可以选定一个自由单元格,使其变成阻塞单元格,问有多少这样的自由单元格能够使得连通块数量变成3?

思路

题目限定了给定的连通块数量不超过1,

0的话就是0

那么我们就要找一个点,在它变成阻塞单元格的时候能够使得连通块数量增加2

这样有且仅有

x.x       ...

...        x.x

 两种情况,只需判断即可

代码

inline void solve() {
     int n; cin >> n;
     string s[2];
     cin >> s[0] >> s[1];
     int ans = 0;
     for (int i = 1; i < n - 1; i ++ ) {
        for (int j = 0; j < 2; j ++ ) {
            if (s[j][i] == '.' && s[j][i - 1] == '.' && s[j][i + 1] == '.'
            && s[j ^ 1][i] == '.' && s[j ^ 1][i - 1] == 'x' && s[j ^ 1][i + 1] == 'x') ans += 1;
        }
     }
     cout << ans << endl;
	 return;
}

C题:Even Positions 

题意

一对()的贡献为(和)之间的距离,已知偶数位上的)和(情况分布,请你进行构造使得各个()的贡献之和最小

思路

从左往右看

对于当前位置,要增加的贡献为之前的(数量

那么我们只需要控制(的数量最小即可,最后一位肯定是),那我们只需要在(数量为0时加1即可

代码

inline void solve() {
     int n; cin >> n;
     string s; cin >> s;
     int ans = 0, add = 0;
     for (int i = 0; i < s.size(); i ++ ) {
        if (i % 2 == 0) {
            add ? add -= 1 : add += 1;
        }else {
            s[i] == '(' ? add += 1 : add -= 1;
        }
        ans += add;
     }
     cout << ans << endl;
	 return;
}

D题:Maximize the Root 

题意

对于任意一个节点u,可以使得其值加1,其子树上的节点的值减一(本身除外)

在此过程中要确保任意一个节点的值不小于0

问根节点的值最大为多少?

思路

因为是使得整个子树减1,那么就要确保整个树平均大

何为平均大?

比如

5

8

我们只能让其变成

6

因为根节点增加1,是要使得整个树减去1的,那我们就要确保能够增加上这个值(除根节点外的所有节点都要大于等于这个值)

而对于

8

5

要变成

5

还是上面的那一个道理 

上面的都是一个子节点的情况,我们再按多个进行分析即可

多个是按照短板效应的

5

6,7,8,9,10000 

这个5不会增加值

最后我们再分析根节点

因为我们从叶节点往上推的过程中,满足了根节点的所有子节点的值是其对应的子树最小的 

那么只要将根节点加上其中的最小值即可

inline void solve() {
     int n; cin >> n;
     vector<int> a(n + 1);
     for (int i = 1; i <= n; i ++ ) cin >> a[i];
     vector<vector<int>> e(n + 1);
     for (int i = 2; i <= n; i ++ ) {
        int x; cin >> x;
        e[x].push_back(i);
     }
    function<void(int)> dfs = [&](int u) {
        for (int v : e[u]) dfs(v);
        if (e[u].empty()) return;
        if (u == 1) {
            int minv = 1e9 + 7;
            for (int v : e[1]) minv = min(minv, a[v]);
            a[1] += minv;
        }else {
            int minv = 1e9 + 7;
            for (int v : e[u]) minv = min(minv, a[v]);
            if (minv > a[u]) a[u] = (a[u] + minv) / 2;
            else a[u] = minv;
        }
     };
     dfs(1);
     cout << a[1] << endl;
	 return;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值