第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; // 输入区域数量 nint 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,最后返回 0for (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认证-第三题
对该题有印象,甚至尝试了一下,但是好像只拿到了部分分数,今天再来研究研究。