[总结]2022-2-9
春节后第一场比赛,状态不好。
P1心路历程
赛时
看到T1马上想到了勾股定理,但没有很好的做法。T2认为是比较好拿部分分的,T3认为可以转化为树形dp来做,但确实不可以。T4也实在没有什么好方法。
前两个小时一直在干T2,用了封装。后面先把T4的打表写完,然后想T1。想到了打表和搜索,但没有想到把两者合二为一。而且由于代码实现能力不足,所以-1。T3想到了菊花图的骗分发,但最后还是没有输出0的高。
最后10min发现T2只能过样例,由于时间限制,没能成功。29分。😦
赛后
wdnmd,T2本来可以拿30多,由于UKE,导致9.1。
T1的搜索本来可以骗点分,结果因为害怕,没有打。
T4要gjd?wnm
P2 比赛反思
- 不应该还害怕困难(T1的搜索),要微笑的面对它,消除恐惧的最好方法就是面对恐惧,加油olg!
- 不要再把时间全部花在一题上!CSP经验没有完全获取。超过1h换题!
多学怎么骗分。- 加强代码实现能力,多打gjd。
P3感想
- 自己有太多没有学习的东西了。
- 花点时间再字符串上面。
P4题目总结
T1
打表+dfs/dp。先把周长不超过300的直角三角形的三条边的长度打表求出(勾股数),然后以周长排序,顺便去重。(比如有了3 4 5,不应再有 4 3 5)枚举勾股数然,后看看木棒能否拼成勾股数。3个很类似的dfs。
剪枝如下:
- 如果发现现在的勾股数的和已经超过了木棒的最大周长,退出。
- 搜到能拼成木棒第一个勾股数,再搜第二个,再再搜第三个。
- 设置全局变量,如果现在可以满足当前的勾股数,一直退,直到退出搜索。
- 多一个参数,计入上一次搜到的木棒的下标在哪,从上一次搜到的下标开始搜。代码如下
for(int i=lst+1;i<=n;++i)
{
if(!vis[i])
{
vis[i]=1;
dfsa(x+a[i],i);
vis[i]=0;
}
}
T2
要用后缀数组。
T4
引用此段。
把所有给的数加起来,就是每个数字出现次数的总和(废话,把这个总和记为x。
我们知道,1~9对总和的贡献是9:9个数,每个数有1个数字。
10~99对总和的贡献为180:90个数,每个数有2个数字。
100~999对总和的贡献为2700………………
我们再用x从前往后依次减9,180,2700…………直到减到不能减为止,我们把减的次数记为t,剩下的差记为a。
很明显,答案应该是个t+1位数。它减去了1~(10^t - 1)的贡献,所以剩下的贡献都是由(t+1)位数构成的。
我们把a/(t+1)记为l,得出它是(t+1)位数的第 l 个:你不能不取第 * 个而只取第 * +1 个。而且我们第一种不合法的情况就出来了:a%(t+1) != 0。
那么我们的答案就是l+10^(t+1) - 1。
但是到这里还没完:因为我们没有看0~9每个数具体的个数,所以有可能数据把9的个数减1,8的个数加1;那样的话,用总和算出来依旧合法,但数据实际上是不合法的。
上面那种情况很好处理,我们只需要把dbdbdb的程序偷过来…………我们只需要写一个解决原问题的程序:暨 “ 给一个正整数N,写出从1到N的之间的所有整数,然后统计其中出现的数字0到9分别各有多少个。”
解决的方法很好想,数位dp或分类讨论都行。

浙公网安备 33010602011771号