第十次CCF-CSP认证(含C++源码)

第十次CCF-CSP认证

分蛋糕


题目链接

满分题解

基本思路:我们需要保证除了最后一个小朋友之外的所有人,分得的蛋糕都大于等于给定的K值,为什么是大于等于,是因为本题不存在可以把蛋糕切开的情况。
我举个极端的例子 :
假如K值为10
四个蛋糕的重量:9 100 5 1000 1
输出的只能是 3 这样说可能更好地理解我的意思

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int cake[N];

int main() {
    int n, k;
    // 读取小朋友的数量 n 和每个小朋友至少应分到的蛋糕重量 k
    cin >> n >> k;
    // 读取每个蛋糕的重量
    for (int i = 0; i < n; i++) {
        cin >> cake[i];
    }

    int res = 0;
    int sum = 0;
    // 遍历每个蛋糕,累加蛋糕重量
    for (int i = 0; i < n; i++) {
        sum += cake[i];
        // 当累加的蛋糕重量达到或超过 k 时,分配给一个小朋友
        if (sum >= k) {
            res++;
            sum = 0;
        }
    }

    // 判断最后是否还有剩余的蛋糕(即 sum 不为 0)
    // 如果有,说明剩余蛋糕虽不足 k,但也需分配给一个小朋友,所以小朋友数量加 1
    if (sum > 0) {
        res++;
    }

    // 输出最终能分配到蛋糕的小朋友数量
    cout << res;
    return 0;
}

BZW,解释一下:为什么最后只要sum>0就可以说明有剩余的蛋糕,因为我们在循环体里面每次当sum达到重量的时候会将他重置为0,换句话说只要循环结束之后sum没有被我置为0,那就是有重量不足k的蛋糕(不管是几个),那我直接 全部塞给最后一个倒霉蛋就好

学生排队

题目链接

满分题解

基本思路:其实这就是我们小学的时候 体育老师给我们调整站位的一个事情,一开始都是按学号顺序排的
如果我是学号3 我长得比学号5的同学高 体育老师让我往后走两位,
意味着 我需要出队,然后向后移动两位(后面的向前覆盖两个位置,我走到空出来的位置上去,类似数组的插入),或者说向后交换两次位置(swap函数)

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N];
// n 表示元素的个数,m 表示操作的次数
int n,m;

int main()
{
    // 从标准输入读取元素的个数 n 和操作的次数 m
    cin >> n >> m;
    // 初始化数组 a,将数组元素初始化为 1 到 n 的连续整数
    for(int i = 1; i <= n; i++) a[i] = i;

    // 进行 m 次操作
    while( m -- )
    {
        // 定义两个变量 p 和 q,p 表示要移动的元素,q 表示移动的步数
        int p, q;
        // 从标准输入读取要移动的元素 p 和移动的步数 q
        cin >> p >> q;
        // 定义变量 k 用于记录元素 p 在数组 a 中的位置
        int k;
        // 遍历数组 a,查找元素 p 的位置
        for(int i = 1; i <= n; i++){
            if(a[i] == p){
                // 找到元素 p 后,记录其位置到 k 中
                k = i;
                // 找到后跳出循环,不再继续查找
                break;
            }
        }
        // 如果 q 大于 0,表示要将元素 p 向右移动 q 步
        if(q > 0){
            // 进行 q 次交换操作,将元素 p 逐步向右移动
            for(int i = 0; i < q; i++){
                // 交换当前元素和它右边相邻元素的位置
                swap(a[k + i], a[k + i + 1]);
            }
        }
        // 如果 q 小于 0,表示要将元素 p 向左移动 |q| 步
        else{
            // 将 q 取绝对值,方便后续操作
            q = -q;
            // 进行 q 次交换操作,将元素 p 逐步向左移动
            for(int i = 0; i < q; i++){
                // 交换当前元素和它左边相邻元素的位置
                swap(a[k - i], a[k - i - 1]);
            }
        }
    }
    // 遍历数组 a,将数组中的元素依次输出,元素之间用空格分隔
    for(int i = 1; i <= n; i++)
     cout << a[i] << " ";
    return 0;
}

Markdown语法

题目链接

最简单的样例:

题目解读

题目解读其实大家只要自己尝试一下CSDN的MARKDOWN编辑器就知道怎么回事了,

我们主要常用的就五类,但是这其中是可以允许嵌套的存在的

我给大家截个图 示例展示
下图的左边就是markdown写的文本也就是我编辑时候展示的页面 右边是呈现给大家的页面

满分代码

代码链接
作者:零雨、
思路参考:yxc
虽然思路是Y总课上讲的思路,看上去不难,但是这个大模拟,真正关上视频 自己独立写起来 我感觉还是需要扎实的功底和一些技巧才能AC(我还需要学习很多 很多时候没有办法写的很完善)
这里我用AI加上了注释供大家参考:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
// 用于存储从标准输入读取的一行字符串
string s;

// 函数声明,分别用于处理不同类型的 Markdown 语法
void f1();
void f2();
void f3();

// 函数声明,用于处理 Markdown 中的强调语法和链接语法
string pr1(string s);
string pr2(string s);

// 处理 Markdown 中的强调语法(用下划线包裹的文本)
string pr1(string s) {
    string ans;  // 用于存储处理后的字符串
    for (int i = 0; s[i]; i++) {
        if (s[i] == '_') {
            // 找到下一个下划线的位置
            int j = i + 1;
            while (s[j] && s[j] != '_') j++;
            // 构造 HTML 中的 <em> 标签
            string tepp = "<em>" + s.substr(i + 1, j - i - 1) + "</em>";
            ans += tepp;
            i = j;  // 跳过已经处理的部分
            continue;
        }
        ans += s[i];
    }
    // 处理完强调语法后,继续处理链接语法
    ans = pr2(ans);
    return ans;
}

// 处理 Markdown 中的链接语法([文本](链接))
string pr2(string s) {
    string ans;  // 用于存储处理后的字符串
    for (int i = 0; s[i]; i++) {
        if (s[i] == '[') {
            // 找到 ] 的位置
            int j = i + 1, cun;
            while (s[j] && s[j] != ']') j++;
            // 提取链接文本
            string text = s.substr(i + 1, j - i - 1);
            cun = j + 2;  // 跳过 ] 和 (
            j += 2;
            // 找到 ) 的位置
            while (s[j] != ')') j++;
            // 提取链接地址
            string link = s.substr(cun, j - cun);
            // 构造 HTML 中的 <a> 标签
            string tepp = "<a href=\"" + link + "\">" + text + "</a>";
            ans += tepp;
            i = j;  // 跳过已经处理的部分
            continue;
        }
        ans += s[i];
    }
    return ans;
}

// 处理 Markdown 中的标题语法(以 # 开头)
void f1() {
    int cnt = 0;
    // 统计开头 # 的数量,确定标题级别
    while (cnt < s.size() && s[cnt] == '#') cnt++;
    int cun = cnt;
    // 跳过 # 后面的空格
    while (cun < s.size() && s[cun] == ' ') cun++;
    // 输出 HTML 标题标签,同时处理标题中的强调和链接语法
    cout << "<h" << cnt << '>' << pr1(s.substr(cun, s.size() - cun)) << "</h" << cnt << '>' << endl;
}

// 处理 Markdown 中的无序列表语法(以 * 开头)
void f2() {
    cout << "<ul>" << endl;  // 输出无序列表的开始标签
    int tep = 1;
    // 跳过 * 后面的空格
    while (tep < s.size() && s[tep] == ' ') tep++;
    // 输出列表项标签,同时处理列表项中的强调和链接语法
    cout << "<li>" << pr1(s.substr(tep, s.size() - tep)) << "</li>" << endl;
    while (getline(cin, s)) {
        if (s == "") break;  // 遇到空行,结束无序列表
        if (s[0] == '#') {
            cout << "</ul>" << endl;  // 输出无序列表的结束标签
            f1();  // 处理标题语法
            return;
        }
        if (s[0] != '*') {
            cout << "</ul>" << endl;  // 输出无序列表的结束标签
            f3();  // 处理段落语法
            return;
        }
        int tep = 1;
        // 跳过 * 后面的空格
        while (tep < s.size() && s[tep] == ' ') tep++;
        // 输出列表项标签,同时处理列表项中的强调和链接语法
        cout << "<li>" << pr1(s.substr(tep, s.size() - tep)) << "</li>" << endl;
    }
    cout << "</ul>" << endl;  // 输出无序列表的结束标签
}

// 处理 Markdown 中的段落语法
void f3() {
    cout << "<p>" << pr1(s);  // 输出段落开始标签,同时处理段落中的强调和链接语法
    while (getline(cin, s)) {
        if (s == "") {
            cout << "</p>" << endl;  // 遇到空行,结束段落
            return;
        } else if (s[0] == '#') {
            cout << "</p>" << endl;  // 输出段落结束标签
            f1();  // 处理标题语法
            return;
        } else if (s[0] == '*') {
            cout << "</p>" << endl;  // 输出段落结束标签
            f2();  // 处理无序列表语法
            return;
        }
        cout << endl << pr1(s);  // 继续输出段落内容,同时处理强调和链接语法
    }
    cout << "</p>" << endl;  // 输出段落结束标签
}

int main() {
    while (getline(cin, s)) {
        if (s == "") continue;  // 跳过空行
        if (s[0] == '#') {
            f1();  // 处理标题语法
        } else if (s[0] == '*') {
            f2();  // 处理无序列表语法
        } else if (s[0] != '#' && s[0] != '*')
            f3();  // 处理段落语法
    }
    return 0;
}

结语

今天是第十次 我把这些天写的文章整理成专栏 希望能帮到大家 祝看到这里的你有美好的一天 我们下期再见!

资源链接: CCP-CSP认证专栏

相关推荐
一只码代码的章鱼10 分钟前
数据结构与算法-图论-欧拉路径和欧拉回路(有向图和无向图,骑马修栅栏,单词游戏 play on words)详细代码注解
算法·图论
2301_8047744923 分钟前
算法题练习
java·开发语言·算法
Doopny@25 分钟前
矩阵转置(信息学奥赛一本通-1126)
算法
酷酷的崽79827 分钟前
如何在AVL树中高效插入并保持平衡:一步步掌握旋转与平衡因子 —— 平衡因子以及AVL结构篇
c语言·数据结构·c++
阿巴~阿巴~41 分钟前
蓝桥杯刷题——第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
c语言·c++·蓝桥杯
敲上瘾1 小时前
共享内存通信效率碾压管道?System V IPC原理与性能实测
linux·运维·服务器·c++·算法·信息与通信
夜泉_ly1 小时前
项目日记 -云备份 -项目认识与环境搭建
linux·网络·c++
jyan_敬言2 小时前
【C++】入门基础(二)引用、const引用、内联函数inline、nullptr
c语言·开发语言·数据结构·c++·青少年编程·编辑器
UpUpUp……2 小时前
模拟String基本函数/深浅拷贝/柔性数组
开发语言·c++·算法
L_M_TY2 小时前
D. Bash and a Tough Math Puzzle
数学·算法·线段树·gcd