Educational Codeforces Round 127 (Rated for Div. 2)

本文详细解析了四道编程竞赛题目,包括字符串仅由aa、aaa、bb、bbb组成的可能性,一维坐标点通过操作变为连续一段的条件,如何在有限资金下购买最多糖果,以及如何插入数列使得相邻差值之和最小。文章通过AC代码展示了不同问题的解决策略和思考过程,帮助读者深入理解算法思维。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Educational Codeforces Round 127 (Rated for Div. 2)

比赛链接

A.String Building

题意: 给定字符串s,问s能否由aa、aaa、bb、bbb四种字符串构成
思路: 不能出现单个a或者单个b
AC代码:

#include <iostream>
#include <bits/stdc++.h>

#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod =  1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 100000 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}



signed main() {
    fio;
    int _; cin >> _; while (_ -- ) {
        string s; cin >> s;
        int i = 0;
        bool flag = true;
        while (i < s.size()) {
            int j = i + 1;
            while (j < s.size() && s[j] == s[i]) j ++ ;
            if (j - i < 2) {
                flag = false;
                break;
            }
            i = j;
        }
        cout << (flag == true ? "YES\n" : "NO\n");
    }
    return 0;
}

B. Consecutive Points Segment

题意: 一维坐标系上有n个点,可以执行如下操作任意次:选点一个点xi,可以使xi = xi - 1或者xi + 1。问能否使给定的n个点变为在x轴上连续的一段。
思路1: n个数有n - 1个间隔,对间隔的长度进行分类讨论d = a[i] - a[i - 1]

  1. d > 3,直接go die
  2. d == 3,只能有一个,并且不能有d==2的区间。
  3. d== 2, 最多有两个
    AC代码:
#include <iostream>
#include <bits/stdc++.h>

#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod =  1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}


signed main() {
    fio;
    int _; cin >> _; while(_ -- ) {
        int n; cin >> n;
        vector<int> v(n);
        for (auto &x : v)   cin >> x;
        bool flag = true;
        int d1 = 0, d2 = 0, d3 = 0;
        for (int i = 1; i < n; i ++ ) {
            int d = v[i] - v[i - 1];
            if(d == 1)  d1 ++ ;
            else if(d == 2)  d2 ++ ;
            else if(d == 3)  d3 ++ ;
            else {
                flag = false;
                break;
            }
        }
        if(d3 > 1)  flag = false;
        if(d2 > 2)  flag = false;
        if(d3 && d2)    flag = false;
        cout << (flag == true ? "YES\n" : "NO\n");
    }
    return 0;
}

思路2: 每个数ai都减去i,相当于消去了位置上的差异,题目变为所有数能否都变为一个数
AC代码:

#include <iostream>
#include <bits/stdc++.h>

#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod =  1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}



signed main() {
    fio;
    int _; cin >> _; while(_ -- ) {
        int n; cin >> n;
        vector<int> v(n);
        for (auto &x : v)   cin >> x;
        for(int i = 0; i < v.size(); i ++ )
            v[i] -= i;
        int minn = *min_element(v.begin(), v.end());
        int maxn = *max_element(v.begin(), v.end());
        cout << (maxn - minn <= 2 ? "YES\n" : "NO\n");
    }
    return 0;
}

C. Dolce Vita

题意: 初始给定n包糖果的价格,每过一天糖果的价格会增加1,每天有固定的钱,问最终可以买到多少糖果。
思路: 贪心的思想,先买最便宜的,所以排序+前缀和,计算该物品一共可以买几天。
AC代码:

#include <iostream>
#include <bits/stdc++.h>

#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod =  1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}

int n, x;
int a[N];
int s[N];

signed main() {
    fio;
    int _; cin >> _; while(_ -- ) {
        cin >> n >> x;
        for (int i = 1; i <= n; i ++ )   cin >> a[i];
        sort(a + 1, a + 1 + n);
        for (int i = 1; i <= n; i ++ )   s[i] = s[i - 1] + a[i];
        int ans = 0;
        for (int i = 1; i <= n; i ++ ) {
            if (s[i] <= x) {
                ans += (x - s[i]) / i + 1;
            }
            else {
                break;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

D. Insert a Progression

题意: 给定n个数和m个数,将m个数插入到这n个数中,如何插入,可以使得最终的相邻两位差的绝对值之和最小。
思路: 判断插在首段和末端以及最值旁边三种情况下的最优解。
AC代码:

#include <iostream>
#include <bits/stdc++.h>

#define x first
#define y second
#define int long long
#define pb push_back
#define rep(i, a, b) for(int i = a; i < b; i ++ )
#define per(i, a, b) for(int i = b - 1; i >= a; i -- )
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

const int INF = 0x3f3f3f3f;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int mod =  1e9 + 7;
const double eps = 1e-6;
const int PI = acos(-1);
typedef vector<int> VI;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
inline int lowbit(int x) {return x & (-x);}
int powmod(int a,int k, int p) {int res=1;a%=p; assert(k>=0); for(;k;k>>=1){if(k&1)res=res*a%p;a=a*a%p;}return res;}

int n, x;
int a[N];

signed main() {
    fio;
    int _; cin >> _; while(_ -- ) {
        cin >> n >> x;
        int minn = INF, maxn = -1;
        for(int i = 0; i < n; i ++ ) {
            cin >> a[i];
            minn = min(minn, a[i]);
            maxn = max(maxn, a[i]);
        }
        int res = 0;
        for(int i = 1; i < n; i ++ )    res += abs(a[i] - a[i - 1]);
        if(x > maxn)    res += min({abs(a[0] - x), abs(a[n - 1] - x), 2 * (x - maxn)});
        if(1 < minn)    res += min(abs(a[0] - 1), min(abs(a[n-1] - 1), 2 * (minn - 1)));
        cout << res << endl;
    }
    return 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级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值