第37次CCF认证-第三题

  主要是间接赋值比较难。

  自己编写的代码如下,但是有问题,没有解决间接赋值的问题,可以参考一下deepseek的回答。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
long long n,x;
char a,c,d;
string b;
map<char,string> m;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        switch (x)
        {
        case 1:
            cin>>a>>b;
            m[a]=b;
            break;
        case 2:
        {
             cin >> a;           // 读取目标字符 'c'
             string src1, src2;  // 用于读取 "$a" 和 "$b"
             cin >> src1 >> src2;
             // 提取 '$' 后面的字符(假设格式一定是 "$X")
             c = src1[1];        // 取 "$a" 的第二个字符 'a'
             d = src2[1];        // 取 "$b" 的第二个字符 'b'
             m[a] = m[c] + m[d]; // 合并 m['a'] 和 m['b']
        }
            break;
        case 3: //case 标签之间不能有变量的初始化,除非使用大括号 {} 创建一个作用域来限制变量的生命周期。
         {
            cin>>a;         //还是不对,没办法更新,这里
            int len=m[a].size();
            int ans=len%1000000007;
            cout<<ans<<endl;
         }
            
            break;
        default:
            break;
        }
    }
    return 0;
}

  引入变量:

// 变量可以是直接赋值的字符串,或者是间接赋值的表达式
struct Variable {
    bool is_direct; // 是否是直接赋值
    string direct_value; // 直接赋值的值
    vector<string> expr; // 间接赋值的表达式(按空格分割的操作数)
};

map<string, Variable> variables; // 存储所有变量

  但是deepseek给的代码运行起来也有问题,我就没再继续研究下去了。开始做有题解的题目吧。

第36次CCF认证-第一题 移动

  笔者上次参加过第36次认证,菜菜的我只拿了190分,这次再重新做┭┮﹏┭┮

  第一题我就不重新写了,我记得当时好像被小坑了一下,在注意外围不能超过n时,下限也不能低于1。

第36次CCF认证-第二题

  笔者当时没有拿满分,这次看看题解再重新做一次吧。参考题解:CCF-CSP 梦境巡查-CSDN博客

#include <bits/stdc++.h>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n; // 输入区域数量 n
    int len = n + 1; // 区域编号 0~n,共 n+1 个区域
    vector<int> a(len, 0); // a[0]~a[n]:移动消耗的能量
    vector<int> b(len, 0); // b[1]~b[n]:补给的能量(b[0] = 0)

    // 输入 a[0]~a[n]
    for (int i = 0; i < len; i++) {
        cin >> a[i];
    }

    // 输入 b[1]~b[n]
    for (int i = 1; i < len; i++) {
        cin >> b[i];
    }

    // 遍历每个区域 i(1~n),计算当 b[i] = 0 时的最小初始能量 w(i)
    for (int i = 1; i < len; i++) {
        int ans = 0; // 记录剩余能量的最小值
        int sum = 0; // 当前剩余能量
        int temp = b[i]; // 保存 b[i] 的原始值
        b[i] = 0; // 模拟 b[i] = 0 的情况

        // 模拟巡查过程:从 0 出发,依次访问 1~n,最后返回 0
        for (int j = 0; j < len; j++) {
            sum = sum - a[j] + b[j]; // 移动消耗 a[j],到达后获得 b[j]
            ans = min(ans, sum); // 更新剩余能量的最小值
        }       //!如果是负数的话也没关系 本来就是要求缺多少

        b[i] = temp; // 恢复 b[i] 的原始值 注意这里需要回复b[i]的原始值
        cout << abs(ans) << " "; // w(i) = |min_energy|
    }

    cout << endl;
    return 0;
}

  我对中间的模拟还有一些疑惑,于是问了deepseek:

第36次CCF认证-第三题

  对该题有印象,甚至尝试了一下,但是好像只拿到了部分分数,今天再来研究研究。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐