CCF-CSP认证考试准备第十七天

ops/2024/9/22 12:58:49/


写了一些第3题大模拟,难点为题意的理解和字符串的处理,以及一些模拟的难点,考虑到时间迫近,刷第3题效率不怎么高,继续刷之后的第1和2题,保持手感

### Day17:1.201803-1 2.201803-2 3.201803-3

#### 1.201803-1:跳一跳(小模拟)
简单,过

#### 2.201803-2:碰撞的小球(小模拟)
(1)满分代码:
```
#include <bits/stdc++.h>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    int n,L,t;
    cin>>n>>L>>t;
    vector<int> vballs(n,0);
    vector<int> vspeeds(n,1);
    for(int i=0;i<n;i++){
        cin>>vballs[i];
    }
    while(t--){
        //先移动前检查 
        for(int i=0;i<n;i++){
            //初始位置和最后位置优先考虑 
            if( (vballs[i]==L && vspeeds[i]==1) || (vballs[i]==0 && vspeeds[i]==-1)){
                vspeeds[i]=-vspeeds[i];
            }
            vballs[i]+=vspeeds[i];
        }
        //再检测是否碰撞(只改变一次) 
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(vballs[i]==vballs[j]){
                    vspeeds[i]=-vspeeds[i];
                    vspeeds[j]=-vspeeds[j];
                    break;
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        cout<<vballs[i]<<" ";
    }
    return 0;
}
```
(2)注意:一开始检测碰撞j从0开始遍历,会导致一对i和j被更改两次,等于不变,j应该从i+1开始遍历;移动前检测初始位置不止要看位置,还要看速度,两个限制条件
(3)**原来想通过先排序来优化的,但是会丢失顺序导致输入有问题,但是可以构建结构体数组储存id,先按位置排序,检测碰撞只要检测i和i+1即可,大大优化,最后再按id返回原来顺序即可**,但这题数据量较小,没有较大区别

#### 3.201803-3:URL映射(大模拟)
鉴于离CCF-CSP认证还有4天,自己写第3题太耗时间,所以找到一个# [CCF-CSP 第三题字符串整理(模拟大法好)](https://www.cnblogs.com/demian/p/9609223.html "发布于 2018-09-08 14:56")博客,希望阅读别人的代码来增强自己的第3题能力
(1)本题难点:
1.规则的相邻两项之间用‘/’分开,所以我们先把所有项分开:(**重点学习**)分离字符串这里用**字符串流处理,先把所有的‘/’变为空格,然后一个一个把各项分开。**
2.**原代码是开多个数组,后面使用要回过头看,太麻烦,直接封装成结构体,思考想要储存什么数据(输入的,中途判断的条件),要用什么数据结构(数组,一维or二维?)**
3.题目中关于' \ '的判断,末尾有呢还是没有?
4.模拟的细节注意,判断条件的先后顺序决定能不能提前return false退出,以及能不能中间一个else if判断到那直接return true(写函数的好处体现出来了,return true和return false异常简单)
5.像这种去匹配n个规则的某一个的,函数传入参数为一个规则,遍历在main函数里面写,**这题的结果string result是作为引用参数传入函数来改变的,而不是作为函数的返回结果**,因为match函数最终是起到bool判断效果判断输出结果,但在判断中途就可以改变result,所以选择为引用参数传入函数
(2)优化满分代码:
```
#include<bits/stdc++.h>

#define LL unsigned long long

using namespace std;

const int MAXN = 101;

struct Rule {
    string name;               // 规则名称
    string pattern;            // 规则 URL 模式
    int paramCount;            // 规则中的参数个数
    int hasSlash;             // 规则是否以 '/' 结尾
    string parts[MAXN];        // 规则的各个部分
};

Rule rules[MAXN];               // 保存所有规则
string queryParts[MAXN];        // 保存查询 URL 的各个部分
int hasSlash;                   // 查询的 URL 是否以 '/' 结尾

// 判断输入的字符串是否为整数,并去除前导零
string isNum(string s) {  
    bool isOk = false;
    string num;
    int len = s.length();
    for(int i = 0; i < len; i++) {
        if (s[i] < '0' || s[i] > '9') return "-";//学习点1:这个函数返回值不是bool值(直接将判断和提取变成一个函数了),所以不符合条件返回"-"
        if (isOk || s[i] != '0'){
            num += s[i];
            isOk = true;
        }
    }
    return num == "" ? "0" : num;
}

// 解析 URL 或规则,将其按 '/' 分割,并保存在 parts 数组中
void parseURL(string s, int &hasSlash, string parts[], int &count) {
    hasSlash = count = 0;
    int len = s.length();
    if (s[len - 1] == '/') hasSlash = 1;
    //学习点2,将' \ '变为空格后字符串输入流提取每一项字符串
    for (int p = 0; p < len; p++) {
        if (s[p] == '/') s[p] = ' ';
    }
    stringstream ssIn(s);
    string part;
    while (ssIn >> part) parts[count++] = part;
}

// 判断当前 URL 是否匹配第 j 条规则,并提取参数
bool match(int t, const Rule &rule, string &result) {  
    result = "";
    int p1 = 0, p2 = 0;
    if (hasSlash ^ rule.hasSlash) return false; 
    while (p1 < t && p2 < rule.paramCount) {
        if (queryParts[p1] == rule.parts[p2]);
        else if (rule.parts[p2] == "<int>") {
            string num = isNum(queryParts[p1]);
            if (num == "-") return false;
            result += " " + num;
        } 
        else if (rule.parts[p2] == "<str>") {
            result += " " + queryParts[p1];
        } 
        else if (rule.parts[p2] == "<path>") {
            result += " " + queryParts[p1++];
            while (p1 < t) result += "/" + queryParts[p1++];
            if (hasSlash) result += '/';
            return true;
        } 
        else return false;
        p1++; p2++;
    }
    if (p1 != t || p2 != rule.paramCount) return false; 
    return true;
}

int main() {                                          
    int n, m;
    cin >> n >> m;
    // 输入 n 条规则
    for (int i = 0; i < n; i++) {
        cin >> rules[i].pattern >> rules[i].name;
        parseURL(rules[i].pattern, rules[i].hasSlash, rules[i].parts, rules[i].paramCount);
    }
    // 输入 m 个查询 URL
    for (int i = 0; i < m; i++) {
        string result, query;
        int partCount = 0;
        hasSlash = 0;
        cin >> query;
        parseURL(query, hasSlash, queryParts, partCount);
        bool matched = false;
        //依次与n条规则相匹配
        for (int j = 0; j < n; j++) {
            if (match(partCount, rules[j], result)) {
                cout << rules[j].name << result << endl;
                matched = true;
                break;
            }
        }
        if (!matched) cout << 404 << endl;
    }
    return 0;
}

```
(3)**重点学习**:
**通过特定分隔符划分字符串片段**:
本题(将\变成空格): ^516dc0
```
for (int p = 0; p < len; p++) {
        if (s[p] == '/') s[p] = ' ';
    }
    stringstream ssIn(s);
    string part;
    while (ssIn >> part) parts[count++] = part;
```
**getline优化**:
```
stringstream ssIn(s); 
string part; count = 0; 
while (getline(ssIn, part, '/')) { // 直接以 '/' 分割 (注意getline的顺序)
    if (!part.empty()) { // 跳过空的部分 
    parts[count++] = part; 
    } 
}
```


http://www.ppmy.cn/ops/114254.html

相关文章

分享一个基于微信小程序的居家养老服务小程序 养老服务预约安卓app uniapp(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

掌握 JavaScript 中的函数表达式

函数表达式是 javascript 中定义函数的一种方式。与函数声明不同&#xff0c;函数表达式可以是匿名的&#xff0c;并且通常用于将函数视为值的情况。在本文中&#xff0c;我们将探讨函数表达式、如何将函数视为值、回调函数以及函数表达式和函数声明之间的差异。 函数表达式 …

一个WebSocket的前端封装类

一、概述 实现一个MyWebSocket的自定义 WebSocket 类&#xff0c;用于建立与服务器的 WebSocket 连接&#xff0c;并提供了一系列方法来处理连接状态、发送和接收消息、自动重连等功能。该类可以方便地在前端项目中实现与服务器的实时通信。 二、实现思路 类的构造函数接收 …

灵当CRM index.php SQL注入漏洞复现

0x01 漏洞描述&#xff1a; 灵当CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;是一款面向中小企业的客户关系管理软件&#xff0c;旨在帮助企业更好地管理客户信息、销售流程、市场营销和服务支持等方面的工作。灵当CRM提供了一系列工…

C#解决方案的各种操作

C#开发编程软件下载安装 C#开发编程软件下载安装_c#下载安装-CSDN博客文章浏览阅读208次。。。。_c#下载安装https://rxxw-control.blog.csdn.net/article/details/140879228 C#和S7-1200PLC S7.NET通信 C#和S7-1200PLC S7.NET通信_c# s1200 s7协议设置-CSDN博客文章浏览阅读…

[ffmpeg] 录制

整理 ffmpeg 录制用到的一些 API&#xff0c;以及一些理解 API调用 常用API AVFormatContext *avformat_alloc_context(void); // 创建 avformat 上下文结构体 void avformat_free_context(AVFormatContext *s);// int avformat_alloc_output_context2(AVFormatContext **c…

山东潍坊戴尔存储服务器维修 md3800f raid恢复

山东戴尔存储故障维修 存储型号&#xff1a;DELL PowerVault md3800f 故障问题&#xff1a;存储除尘后通电开机&#xff0c;发现有物理硬盘没有插到位&#xff0c;用户带电拔插了多块物理盘&#xff0c;导致关连的磁盘阵列掉线&#xff0c;卷失败&#xff1b; 处理方式&#xf…

音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…