当前位置 博文首页 > Miracle_ma的专栏:codeforces好题集合 (持续更新)

    Miracle_ma的专栏:codeforces好题集合 (持续更新)

    作者:[db:作者] 时间:2021-08-15 16:24

    再次感到智商的不足,所以决意以后必须多刷cf了,cf不仅锻炼智商,还能锻炼代码能力,锻炼手速,是非常不错的,以后要多做,就算现在被虐成翔,相信一年之后也会有很大的提高。让我们?一起享受智商被碾压?的快感把


    首先是最近一场cf的div1的AB两题

    CodeForces 571A

    题目链接:http://codeforces.com/problemset/problem/571/A

    题意:给你三根木棒长度为a,b,c,然后给你长度 l?的木棒,让你可以把a,b,c随意加长,但是加长的总和不能超过l的方案数(可以不加长)

    题解:我看到这题基本没多少想法,就算有不敢说是对的,没有很好的方法解决

    那就开门见山把,用题解的方法,这题正着比较难,所以就先求出所有分棒子的情况,然后去掉里面不能构成三角形的情况(orz)

    所有分棒子的情况,就是个组合问题,假设有a,b,c分别增加了x,y,z,x+y+z=i<=l? (0<=i<=l)

    就是把i长度的棒子切成三段,切两刀,(假设第一刀一定在第二刀的前面或者同一处)

    长度i的棒子,一共有i+1处可以切,因为可以分给a长度0-i,所以有i+1刀

    如果第一刀切0,第二刀也有i+1种

    第一刀切1,第二刀就有i种切法

    所以总的方法就是(i+1) +(i) +?(i-1)+……+1=C(i+2,2);

    0<=i<=l,所以所有分棒子的方法就是C(2,2)+C(3,2)+……C(l+2,2)

    根据排列组合公式,C(2,2)=C(3,3),+C(3,2) =C(4,3),+C(4,2)=C(5,3)

    所以C(2,2)+C(3,2)+……C(l+2,2)=C(l+3,3)??这是总的分棒子?的方法


    然后就是求不能构成三角形的情况啦,我感觉这个考虑方法比较巧妙

    先考虑把a增加之后的边考虑成最长边并且使三角形不成立,就是b+c=a+i

    然后就是考虑从a+i,a+i+1……a+l,这些情况,当a+i,b,c构不成三角形的时候,要把剩下的l-i的长度分给b,c,并且使b‘+c’<=a+i

    此时能够分给b,c的长度为min(l-i,a+i-b-c)=x;然后将这段分给b,c的情况,就是C(x+2,2)

    为什么呢,同上,就是长度x的棒子,切两刀,前两段给b,c,最后一段扔掉好了

    这样就是最长边是a所在的边的不能构成三角形的情况

    b,c同理

    并且这样考虑不会有重复,因为你定的最长边就不一样

    代码十分简短,这就是cf的魅力,我要?继续努力,终有一天争取能在div1立足,脑洞开之

    AC代码:http://paste.ubuntu.net/12229055/

    /****************************************************************华丽的分割线***********************************************************************/

    575D?:Tablecity?http://codeforces.com/problemset/problem/575/D

    这题目没有输入,题意比较呵呵,我都没理解,后来年神带我过了之后感觉这题还是非常的好

    题意:给你个2*1000的长方形,然后上面有个小偷,小偷每次可以往6个方向逃窜,左右,左上左下,右上右下,然后你是警察,你每次可以派两个警察进行搜查,就是可以搜查两个点,问你最小需要多少次,你肯定可以找到小偷

    题解:刚看完题是不是很呵呵,所以我还练习的不够,瞎找肯定是不可能的,所以肯定是有规律的,两个警察必须在同一竖行,这样可以把长方形的宽2都填满,然后一格一格的搜索,因为发现小偷每次是只能左右的移动,如果你两个搜索点叠着,那么上下都可以不考虑了,等于就是一个1*1000的长方形,里面你用一个警察去搜索小偷,然后这要应该考虑格子的奇偶关系,如果小偷开头在偶数,你也在偶数,那么你从最后一格1000开始往前走,肯定能找到,如果小偷在奇数,你在偶数,那么肯定最后会错过,当你从1000搜到1的时候,小偷这会在偶数,下一步小偷在奇数,你应该也从奇数开始搜,就是999开始往前,所以一共最少1999次可以肯定找到

    代码三行,就不贴了,这题目还是不错的,我现在是阅读理解能力和脑洞都不足啊还需努力

    一天一场cf,健康生活五十年啊

    /*********************************************************************************************************************************************************/

    575H?Bots?http://codeforces.com/problemset/problem/575/H

    题意:给一个点,然后可以走红色或者蓝色的路,然后走到底之后,从根节点到叶子节点的路上面一共有n条蓝色n条红色边,问最后树里有多少个点

    题解:比如第i层,走了i条边,所以在第n+1层的时候有两个点只能走一种颜色了,然后在i>n的情况下,每次都有一些点只能走一个颜色,可以用组合数求出来,???????????????????

    就是2*C(i,i-n)个点只能走一种颜色,其中要用逆元求解一下组合数

    AC代码: http://paste.ubuntu.net/12319046/


    cs