第37次csp考试
Published:
第37次csp认证
- 考了280,做了第一题、第二题和第三题的一部分
第一题
- 简单题,有手就行
第二题
- 题目:给你n个苹果,一天内最多吃m个(m<=n),一天内吃了i个苹果可以获得a[i]的喜悦值(i<=m),n个苹果怎么吃分几天吃才能获得最大的喜悦值
- 答案:完全背包,w[i]=i,c[i]=a[i],v=n,容量为n,耗费为i,价值为c[i]
- 板子代码如下
for(int i=1;i<=m;i++){ for(int j=1;j<=v;j++){ if(j>=w[i]) f[j]=max(f[j],f[j-w[i]]+c[i]); } }
- 写到这又翻了一下自己带的板子,动态规划学得真的很差
第三题
- 题目:输入数字n,代表接下来有n条语句
- 若语句以1开头,形如1 var expr,则代表给变量var赋值expr
- expr若是$val,则将变量val对应的表达式值赋给var
- expr若是hello world,则将helloworld赋给var(组合去掉空格)
- 若语句以2开头,形如2 var expr,则代表var对应的expr是可变的
- 形如 2 var $val,若val改变,则var跟着改变
- 若语句以3开头,形如3 var,输出var对应表达式的长度
- 思路:
- 第一步是读入带空格的超长字符串,getline
- 第二步是拆分读到的超长字符串为vector
- 第三步就分析表达式,若直接赋值,则存入unordered_map<string,int>中,int记录对应字符串的长度;若间接赋值,则存入unordered_map<string,vector
>中,vector 中存对应的变量
- 注意事项:
- 为什么用int,因为表达式很长,直接存会爆内存,只能过40%的点
- 按照这个思路可以过80%的点,剩下两个点TLE了
- 读入数字,再getling,中间需要加cin.ignore()
第四题
- 题目:给定数组,让你算$\sum_{l=1}^n\sum_{r=l}^n rlgcd(a[l],a[r])$
- 最大公约数不会算,😔
- 我的想法是找质因数,按照质因数对应数量最小乘起来就行,寄了
第五题
- n个景点,n-1条路,景点有门票也有送钱的,耗费可以为正也可以为负,首先从1开始算跑到末端的基础耗费最大值
- 操作1,从i点的子树找基础耗费最大值
- 最抽象就是这是双向的图
- 结果这一问不让往上走,只让往下走,我就寄了
- 现在想想还是不太会,一开始就单项?新建一个边图,只存从1开始的,可能能混15分-操作1和操作2
- 操作2,改变u的节点耗费为x,重新算基础耗费
- 操作3,改变根节点为u,重新算基础耗费
- 操作4,删掉a、b之间的路,增加c、d之间的路,重新算基础耗费
- 除了操作1不改变树本身,剩下的都改变。
- 思路:
- 还是dfs
- 不过0分遗憾退场