首页 > 其他分享 >Educational Codeforces Round 150 A~D

Educational Codeforces Round 150 A~D

时间:2023-07-04 20:15:27浏览次数:55  
标签:150 Educational 字符 int Codeforces pos 枚举 端点 区间

c题好难。

A. Game with Board

Problem - A - Codeforces

题意

给定若干个数字1,Alice和Bob每回合合并两个相同的数字,Alice先手。如果谁最先不能合并数字,谁就胜利。

思路

通过推导可以看出\(n<5\)时先手必输,否则先手胜利的策略是取得只剩下两个数字可以合并。

代码

void solve() {
    int n;
    cin >> n;
    cout << (n <= 4 ? "Bob" : "Alice") << "\n";
}

B. Keep it Beautiful

Problem - B - Codeforces

题意

如果一个序列,把可以前若干个元素移到序列后面,如果这时的序列是非递减的,则称原序列是美丽的。

现在给定几个元素和一个初始为空的序列,如果把元素添加到序列后面后,该序列是美丽的,这输出0;如果该添加后的序列不是美丽的,则不添加这个元素,并输出0。

思路

直接模拟即可。

代码

void solve() {
    int q;
    cin >> q;

    vector<int> v(q+1);
    int f = 0, t1 = 0, t2 = INT_MAX;
    for(int i = 1; i <= q; i++) {
        cin >> v[i];
        if(v[i] >= t1 && v[i] <= t2) {
            t1 = max(t1, v[i]);
            cout << 1;
        } else {
            if(v[i] <= v[1] && !f) {
                cout << 1; f++; 
                t1 = v[i]; t2 = v[1];
            } else {
                cout << 0;
            }
        }
    }

    cout << "\n";
}

C. Ranom Numbers

Problem - C - Codeforces

题意

给定一串由A,B,C,D,E组成的字符串,其中A的值为1,B的值为10,C的值为100,D的值为1000,E的值为10000。如果某字符的右边有大于它的字符,该字符的值为负数,否则为正数。最多可以改变其中一个字符,求整个字符串的最大值。

思路

改变一个字符会产生两种情况,一是修改字符使其贡献值增大,二是把字符改小,使其前面字符的贡献值增大。

可以推出第一种是找出每个字符第一次出现的位置,这样可以最大程度上减少前面字符贡献值变为负数的情况,第二种是找出每个字符最后一次出现的位置,最大程度增加字符贡献值变为整数的情况。然后枚举更改字符后的答案,维护其最大值。

代码

const int p[] = {1, 10, 100, 1000, 10000}; 
 
int func(string s) {
    int res = 0, mx = -1;
    for(int i = s.size() - 1; i >= 0; i--) {
        int c = s[i] - 'A';
        if(c < mx) {
            res -= p[c];
        } else {
            res += p[c];
        }
        mx = max(mx, c);
    }
    return res;
}
 
void solve() {
    string s;
    cin >> s;
 
    int ans = func(s);
    vector<vector<int>> pos(5);
    for(int i = 0; i < s.size(); i++) {
        pos[s[i]-'A'].push_back(i);
    }
    for(int i = 0; i < 5; i++) {
        if(pos[i].empty()) continue;
        for(int j = 0; j < 5; j++) {
            s[pos[i][0]] = char('A' + j);
            ans = max(ans, func(s));
            s[pos[i][0]] = char('A' + i);
            s[pos[i].back()] = char('A' + j);
            ans = max(ans, func(s));
            s[pos[i].back()] = char('A' + i);
        }
    }
 
    cout << ans << "\n";
}

D. Pairs of Segments

Problem - D - Codeforces

题意

给定几个区间,去掉几个区间,使剩下的个区间满足:能够成对组合,相互组合的两个区间相交,且每对区间不与其它区间相交。求最少要去掉几个区间。

思路

可以看成求最大不相交区间数量的升级版。

求最大不相交区间数量,可把区间按右端点排序,然后枚举区间。如果枚举区间的左端点小于标记点,则去掉这个区间,否则更新标记点为枚举区间的右端点。可以证明最后得到的区间数量就是最大不相交区间的数量。

本题把每对区间看成一个区间。设last表示目前单个区间的右端点,cut表示前面一个成对区间的右端点,如果枚举区间的左端点小于等于cut,则去掉这个区间,否则如果小于等于last,则答案加一,更新cut为枚举区间右端点,如果大于last,更新last为枚举区间右端点。

代码

void solve() {
    int n;
    cin >> n;
 
    vector<int> l(n), r(n);
    for(int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
    }
    
    vector<int> v(n);
    iota(v.begin(), v.end(), 0);
    sort(v.begin(), v.end(), [&](int i, int j){return r[i] < r[j];});
 
    int cut = -1, last = -1, ans = 0;
    for(auto i : v) {
        if(l[i] <= cut) continue;
        if(l[i] <= last) {
            ans++;
            cut = r[i];
        }
        else {
            last = r[i];
        }
    }
 
    cout << n - 2 * ans << "\n";
}

标签:150,Educational,字符,int,Codeforces,pos,枚举,端点,区间
From: https://www.cnblogs.com/cenqi/p/17526858.html

相关文章

  • Codeforces Round 879 (Div.2) B ~ D
    D题补了一天...B.MaximumStrengthProblem-B-Codeforces题意给定两串数字,在这两串数字之间找两串数字,要求每一数位之差的绝对值之和最大,求最大值为多少。思路对较少的那串数字添加前导零,使两串数字长度一样。要使所求值最大,就要尽可能使两数字串上相同数位的值分别为0......
  • Codeforces Round 864(Div.2) A~C
    vp过三题,c是交互题,想起了打华师大校赛时的不愉快经历了。A.LiHuaandMazeProblem-A-Codeforces题意给定一个n×m的矩阵,矩阵中有两个点(x1,y1),(x2,y2)。可以往矩阵中添加障碍物,使两个点之间不存在任何路径,求添加的障碍物数量最少为多少。思路可以把其中一个点的四周围......
  • codeforces 树上题目总结
    codeforces树上题目总结CF1559D2先猜一个结论——一定能通过加边让一个森林变成一棵树,归纳一下发现是对的,并且随便加合法的边都符合条件,所以暴力是\(\mathcalO(n^2)\)的。那么考虑如何降低复杂度。我并没有想到。我一直是在往快速找到两个不属于同一集合的点这个方向思考的......
  • Codeforces 293B Distinct Paths
    发现\(n,m\)的数据范围是假的,因为每一步一个颜色最多也就\(k\le10\)种颜色,所以当\(n+m-1>k\)时一定无解。接下来发现这个数据范围挺小的,考虑状压,设\(f_{x,y}\)为走到\((x,y)\)点所用的颜色的集合,其可以由\(f_{x-1,y},f_{x,y-1}\)推来。然后就可以......
  • Codeforces Round 878 (Div3)
    B.BinaryCafe\(1\leqn,k\leq10^9\)题解:思维考虑两种情况第一种:钱足够多,每种咖啡都可以买的情况下,答案为\(2^k\)第二种:钱不够多,因为任一面值的钱数都有唯一的二进制表达方式,所以答案为\(n+1\)所以我们不妨先判断一下\(2^k\)有没有超过\(10^9\),如果超过了说明钱......
  • CodeForces 1508D Swap Pass
    洛谷传送门CF传送门先忽略掉所有\(a_i=i\)的点。考虑我们钦定一个点\(s\),每次与\(a_s\)换直到\(a_s=s\)为止。不难发现这样相当于在置换环上删掉\(a_s\)这个点。这样可以解决\(s\)所在的环。问题是可能会形成很多个环。我们把其他点按照\(s\)极角排序,注意......
  • Codeforces 585D Lizard Era: Beginning
    很容易想到可以对于每个任务选不去的那一个人进行搜索,时间复杂度\(O(3^n)\),明显过不了。发现\(n\le25,\lceil\frac{n}{2}\rceil\le13\),且各个任务间不会互相影响,便可以用折半搜索分成\(2\)部分来搜最后来合并。考虑如何合并两部分,令前一部分得到的值分别为\(a,b,c\),后......
  • Codeforces Round 881 Div2 A-F1题解
    codeforcesround881div2题解马上要秋招了,自己本事全丢了,感觉如果这样的话今年就估计要饿死了。先打div3,7月份得开始收心了A.SashaandArrayColoring题意,可以分任意组,每组的贡献是max-min,问最大贡献显然是贪心,从大到小配对一下就行,不想放代码了’B.LongLong给出一......
  • Codeforces Round #877 (Div. 2) A-E
    A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;intmx=-2e9,mi=2e9;for(inti=1;i<=n;i++){intx;cin>>x;mi=min(x,mi);......
  • Educational Codeforces Round 151 (Rated for Div. 2)
    Preface期末考终于结束了,终于可以回来写题了这场是刚考完最后一门的那个晚上打的,因为太久没有写代码了所以不是很熟练而且脑子也不太灵光,只能堪堪写到D题而且手速感人上次CF第二个号因为Rating被roll了导致从紫名掉下来了,这场就把它又打上去了,再这样后面兴许要用第三个号打了......