codeforces签到题之div4

本文作者分享了在Codeforces编程竞赛中的经验,分析了五道不同类型的题目,涉及模拟、几何、字符串处理等算法,强调了解题过程中寻找规律和学习他人代码的重要性,以提升编程和解题能力。

🌼坏女孩(抖音热门版) - Laziness惰/西洛卡 - 单曲 - 网易云音乐

标签:模拟,暴力,排序,贪心,双指针,几何,字符串

目录

一,codeforces检查 

二,接下来的方向

三,前置和追加

四,明显的分裂

五,负数和正数

总结


前言

昨晚参加了洛谷入门赛和codeforces的div4,今晚参加AcWing周赛

洛谷遇到了不会的思维题,codeforces遇到了写半天只过了样例的题,AcWing遇到了需要dp状态转移的题,,,都是当场没做出来的

接下来,我会把昨晚cf前5题题解写出来,复盘,以便提高会的题目的熟练程度,同时解决未AC题目的BUG

一,codeforces检查 

Problem - A - Codeforces

标签:模拟,字符串 

 逐个比对输入的字母,看是否在codeforces这几个字母里(遍历)

#include<iostream>
using namespace std;
bool check(char a)
{
    string s = "codeforces";
    for(int i = 0; i < 10; ++i) {
        if(a == s[i]) return true;
    }
    return false;
}
int main()
{
    string s;
    int n;
    cin>>n;
    for(int i = 0; i < n; ++i) {
        cin>>s[i];
        if(check(s[i])) cout<<"YES";
        else cout<<"NO";
        if(i != n - 1) cout<<endl;
    }

    return 0;
}

二,接下来的方向

Problem - B - Codeforces

标签:模拟,几何

 

 

两个变量初始为0,分别代表横纵坐标,在加减过程中,加个判断即可

#include<iostream>
using namespace std;
int main()
{
    int n, m, a, b;
    cin>>n;
    for(int i = 0; i < n; ++i) {
        cin>>m;
        string s;
        cin>>s;
        a = 0, b = 0;
        for(int j = 0; j < m; ++j) {
            if(s[j] == 'U') a++;//横坐标
            else if(s[j] == 'D') a--;
            else if(s[j] == 'L') b--;//纵坐标
            else if(s[j] == 'R') b++;
            if(a == 1 && b == 1) {
                cout<<"YES";
                break;
            }
            if(j == m - 1) {
                cout<<"NO";
                break;
            }
        }
        if(i != n - 1) cout<<endl;
    }
    return 0;
}

三,前置和追加

Problem - C - Codeforces

标签:模拟,双指针

 用了s.substr()来截取,头文件#include<cstring>;同时,flag来标记头尾是否还符合删除条件

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    while(n) {
        int m;
        string s;
        cin>>m;
        cin>>s;
        int flag = 1;
        while(flag) {
            flag = 0;
            if(s[0] == '0' && s[m - 1] == '1') {
                s = s.substr(1, m - 2);
                m -= 2;
                flag = 1;
            }
            if(s[0] == '1' && s[m - 1] == '0') {
                s = s.substr(1, m - 2);
                m -= 2;
                flag = 1;
            }
        }
        cout<<s.size();
        if(n != 1) cout<<endl;
        n--;
    }
    return 0;
}

四,明显的分裂

Problem - D - Codeforces

标签:暴力,贪心,字符串 

知识储备:

C++--vector()的用法_海轰Pro的博客-优快云博客_c++ vector

C++中set使用详细说明_想去的远方的博客-优快云博客_c++ set

思路是,将字符串分成两部分,分别用set中元素不重复的特点,得到左右两边不重复的字母数;同时,由于字符数长度最大可达2*10^5,建议用vector保存,不用数组

#include<iostream>
#include<set> //set<char>a;
#include<vector> //vector<int>b(m) ;
using namespace std;
int main()
{
    int n;
    cin>>n;
    while(n) {
        int m;
        cin>>m;
        string s;
        cin>>s;
        set<char>a;
        vector<int>b(m); //长度跟字符串一样
        for(int i = m - 1; i >= 0; --i) {
            a.insert(s[i]); //正序插入
            b[i] = a.size(); //尾在前
        }
        a.clear(); //清空a集合
        int ans = 0; //记得初始化
        for(int i = 0; i < m - 1; ++i) {
            a.insert(s[i]); //头在前
            ans = max(int(a.size()) + b[i + 1], ans); //int转化
        }
        cout<<ans;
        if(n != 1) cout<<endl;
        n--;
    }
    return 0;
}

五,负数和正数

Problem - E - Codeforces

标签:贪心,排序 

真的,codeforces中很多题都和奇偶数的规律有关,比如本题

只要负数的个数是偶数,都可以通过有限次的操作,全部变成正数;

当负数的个数是奇数,也可以通过有限次的操作,通过负数位置的移动,最终剩1个负数

比如

1 -3 4 -16 2 -8 2
1 -3 4 -16 -2 8 2
1 -3 4  16  2 8 2
-1 3 4  16  2 8 2

发现这个规律后,代码就变得很简单了

否则就像我一开始,写了半小时也只过了样例。。。

#include<iostream>
#include<cmath> //abs()
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t) {
        int n;
        cin>>n;
        long long sum = 0, Min = 1e9, flag = 0; //10的9次方
        while(n) {
            long long a;
            cin>>a;
            sum += abs(a); //绝对值
            if(a < 0) flag++; //统计负数个数
            Min = min(Min, abs(a));
            n--;
        }
        if(flag % 2) sum -= 2 * Min; //减去多加的和本身
        printf("%lld", sum);
        if(t != 1) printf("\n");
        t--;
    }
    return 0;
}

总结

codeforces很多思维题(也就是规律题),有种回到初高中数学的感觉,所以,不应该固步自封,我们要算法,规律两手抓,能找到规律就用规律(多点见识大佬们的代码),找不到就老老实实上并查集,二叉树,dfs,STL等等

真的,不要一整天用自己的思路死磕代码,多点看看codeforces里别人的代码,以后你做题都会快很多,思路广很多

这就是为什么你要在优快云,AcWing,洛谷,codeforces四个网站上打比赛的原因,多点看看别人的AC代码,把思维打开

### 关于 Codeforces Round 835 (Div. 4) 目前并未找到针对 **Codeforces Round 835 (Div. 4)** 的具体目解析或官方比赛详情的相关引用[^1]。然而,可以基于以往的比赛模式推测该场比赛的内容结构以及可能涉及的算法知识点。 #### 比赛概述 CodeforcesDiv. 4 类型比赛通常面向新手选手设计,难度较低,适合初学者练习基础编程技能和简单算法逻辑。这类比赛一般包含以下特点: - 目数量较多(通常是 7 到 10 道)。 - 前几道考察基本输入输出、条件判断、循环等基础知识。 - 中间部分目可能会涉及到简单的数学推导、字符串处理或者模拟操作。 - 后续较难的目则会引入贪心策略、动态规划入门概念或者其他经典算法模型。 以下是根据经验总结的一些常见考点及其对应解决方法: --- #### 可能的目类型及解决方案 ##### A. 简单计算 / 输入输出优化 此类问往往只需要按照描述完成特定运算即可。例如求平均值、最大最小值等问。 ```cpp #include <bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t--){ long long a, b; cin >> a >> b; cout << abs(a-b) << "\n"; } } ``` ##### B. 条件分支与枚举 通过列举所有可能性并逐一验证来得出答案。比如寻找满足某些性质的一组整数。 ```cpp for(int i=1;i<=sqrt(n);i++) { if(condition){ answer++; } } cout<<answer<<"\n"; ``` ##### C/D/E/F... 更复杂的逻辑推理 随着字母顺序增加,复杂度逐步提升。这些阶段的问可能需要更深入的理解力才能解答出来。例如动态规划中的状态转移方程定义;图论里最短路径算法的应用等等。 由于缺乏具体的目信息,在此仅提供通用框架作为参考模板供学习者模仿实践之用。 --- ### 提醒事项 对于任何一场竞赛而言,充分准备至关重要。建议参赛前复习相关资料,并尝试独立思考解决问的方法而不是单纯依赖现成代码片段抄袭拼凑而成的作品提交评测系统检测运行效率是否达标最后记得测试边界情况确保程序鲁棒性强不易崩溃异常退出造成不必要的失分遗憾结局发生哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千帐灯无此声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值