CF刷题记录

数学(4):
1、1754E,概率dp的题,首先我们处理出有多少个地方的1和0需要被交换,我们可以计算前总0的数量的位置数中1的个数,即把全部0放在前面的那段里1的数量cnt,我们记dp[i]为还剩下i个需要交换的10位置的期望操作数,显然dp[0]=0,而dp[i]可以从dp[i-1]*(i*i/(n*(n-1)/2))转移,即从n个位置选两个选的为10的数量的概率,然后其他的选择则为(1-(i*i/(n*(n-1)/2)*dp[i]转移,也就是说dp[i]=(1-(i*i/(n*(n-1)/2)*dp[i]+dp[i-1]*(i*i/(n*(n-1)/2))+1,最后那个1为从dp[i-1]转移需要花费1操作数,直接线性dp一下就行了。
2、1654D,我一开始的思路是用dfs从叶子节点开始处理,每次取其对于的数的lcm,最后得出根节点的值,然后向下依次得出其他的数的值,然而这么做是错误的,因为取lcm可能会非常大,而这里的lcm和gcd不能对模数取余,否则会出现错误,正确思路应该是假设1为根节点并且他的值为1,向下得出每个数的分数表示,这样的话对于每个数的分数表示中,其分母我们需要消除从而使每个数都为整数,也就是说1的值至少需要为这些分母(同分子化简后)的每个质因子的次数取最大,最后再从根节点向下赋值,其实这个思路和我的前面那个思路是一致的,我们取分母的每个质因子的最大次数实际上相当于取所有分母的lcm,而前面的那个思路也是取lcm,但我错的就是取lcm时将这个lcm值对998244353取模了,我们将其转化成质因子的次数形式从而求出最后的数则不会有问题,所以关键就在于我们在对数取lcm时,并且lcm会很大时,我们可以考虑将其转化成质因子的形式处理。
3、1634D,这是一道交互题,我们考虑四个数a,b,c,d,我们取da=max(b,c,d)-min(b,c,d),假设a=0,并且b<=c<=d,则da=d-b,db=d,dc=d,dd=c,其中db=dc,那么b和c一定不为0,为什么呢,我们把他们放入一般考虑中,假设有四个数a,b,c,d,那么他们一定存在大小关系,对于处于最大和最小的那两个数,他们的dx值一定相同并且比其他的dx值大,同时由于他们处于中间位置,所以他们一定不会为四个数中的最值,因此我们可以通过四次询问从而排除两个不为0的数,我们不断操作,那么最终只剩下两个或三个数不确定,当剩下三个时,我们取前面去除的一个数加入再操作使其剩下两个数,这样操作次数则为((n-2)/2)*4=2n-4和(n-3)/2*4+4=2n-2,是在题目要求次数之内的,因此可以得出答案。
4、1562C,我们考虑任意取一符合长度的串w,对w的两端分析,如果其两端存在一段向外的一个字母为0,那么我们可以取t为w+1的那个串,可以发现只有当两端总为1时我们这样取不到,但是总为1时意味着整个串全部都为1,那么随意取长度相同的两个串即可。
5、1556D,这是一道交互题,这里存在一个性质,(a|b)+(a&b)=a+b,我们取三个数a1,a2,a3,我们进行6次操作得出a12=a1+a2,a23,a31,那么a2=(a12+a23-a31)/2,再用a12,a23得出a2和a3的值,接着对其他数,我们可以用两次操作得出a1+ai的值从而得出所有数的值,并且n规定大于等于3,因此我们总可以求出所有数的值,进行排序后得答案即可。
6、1628D1,我们考虑n=2,m=1时的情况,第一个数x,如果x较小时,Bob选择加入这个数,那么我们第二个数就选择0,如果x较大时,Bob选择减去这个数,那么我们第二个数选择k,则存在x和k-x两种值,也就是说Bob会对x判断这两种情况并取其中的最小值作为我们的分数,所以我们需要使这两个数的最小值尽可能大,显然是使x为k/2,也就是两个直线的交点,那么我们考虑dp[i][j],在第i个数判断加还是减,我们从dp[i-1][j-1]+x,dp[i-1][j]-x转移,假设此时dp[i-1][j-1]和dp[i-1][j]的值确定,那么这就相当于前面n=2,m=1的思考,即取两者交线处的点,也就是dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])/2,初始化时dp[i][0]=0,dp[i][i]=i*k。
7、1628D2,这题是上题的hard版本,n和m的范围是10的6次方,我们考虑easy版本时的dp[i][j],dp[i][j]只从dp[i-1][j-1]和dp[i-1][j]转移,那么我们考虑从dp[i][j]转移到dp[n][m]中的过程,把他们分解成一步一步的转移过程,那么dp[i][j]会加多少次呢?这可以同过排列组合解决,会加C[n-i][m-j]次,我们这里取C[n-i-1][m-j]次,因为dp[i][i]的值我们是知道的所以我们可以对每个dp[i][i]加了多少次从而求出dp[n][m],但是(i-1,i-1)会转移到(i,i),所以我们使他的第一步为(i,j)->(i+1,j),后面步数考虑存在多少步向右下走的排列组合问题,这样的话就能不重不漏的计算出答案。
8、1626D,我们枚举第一个段和最后一个段填充后为2的i次方长和2的j次方长,贪心的想,我们确定一个长度后一定是使我们能取在这段的数量尽可能的接近2的i次方,因为这多出来的数量放在任何一段所作出的贡献是一样多的,所以我们二分出第一段和第三段放的数的数量,那么我们就知道第二段的放的数的数量,对于这样确定的数显然答案是确定的,为了更好得出答案,我们可以处理一个f数组,表示f[x]为当前段的数量为x时将其变成2的次幂长度的最小填充数量,初始化f[(1<<i)]=0,然后f[i]=min(f[i],f[i+1]+1)处理即可。
9、1619F,我们考虑数量p=(n%m)*((n+m-1)/m),即每次桌上有n/m上取整的总数量,我们让0~p-1对于的下标减1的人在第一次比赛中安排在n/m上取整的桌上,第二次让p~(2*p-1)%n的人在n/m上取整的桌上,这样构造一组答案,可以发现我们每次是使长度为n的线段上的人连续的作为n/m上取整的桌上的人,这样会使得分数不同的人只存在连续的断点上,并且分数相差最多为1,所以满足答案。
10、1621D,首先(n+1,n+1)到(2n,2n)的方格中的冰块一定需要去除,我们考虑位置(1,1)(1,n)(n,1)(n,n)四个点,如果对这些点所在的行和列进行操作处理,那么他们会到(2n,1)(1,2n),(1,n+1)(2n,n),(n+1,1)(n,2n),(n,n+1)(n+1,n)这些点,画图可以发现如果我们走到这些点其中的一个点,我们都能够通过移动操作使得(1,1)到(n,n)的方格的点都转移到(n+1,n+1)到(2n,2n)中,实际上来说,我们是通过(n+1,n+1)到(2n,2n)的四个边角进入的,通过图可以发现如果不从这些点进入我们就一定需要将点移到(1,n+1)到(n,2n)和(n+1,1)到(2n,n)这些方格中从而需要移除更多的点,并且先前提到的八个点中的点也一定会影响到,即必然存在一个八个点中的一个点使我们同样需要消除,所以这种做法比前面的做法更劣,所以我们只考虑从八个点中选择一个点从而有解得出答案即可。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wlzsgl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值