题意 有n个问题答案为YES,m个问题答案为NO. 你只知道剩下的问题的答案分布情况. 问回答完N+M个问题,最优策略下的期望正确数. 解法 首先确定最优策略, 对于\(n<m\)的情况,肯定回答YES: 对于\(n>m\)的情况,肯定回答NO. 所以到最后,肯定由MIn(n,m)个问题可以回答正确. 最后可能正确的情况在于,n==m的情况,有一半的几率正确. 所以加上这部分的期望即可,通过组合数算出路径数目即可.…
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bulb A的沙子数.保证A和B的总沙子数为X. 函数ft(x)表示t时刻,初始bulb A中的沙子数为x时,当前的bulb A中的沙子数是多少. 最开始时函数恰好为f(x)=x. 然后在第一次翻转之前,函数会逐渐向下移动变为<2>的样子,然后在翻转之后,函数又会逐渐向上移动,直至变成<3>…
题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不同的颜色序列. n,m<=3000 解法 容易想到一个dp, 设f[i][j]表示已经执行了i次的操作,然后目前盒子里有j块蓝砖,和n-j块红砖. 共有四种转移,分别是一次操作拿走的砖头为红红.红蓝.蓝红.蓝蓝. 边界为f[0][0..n]=1 然后就会发现算重了, 这是因为不同的颜色序列可能会有不…
题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的字符串. \(x\)是\(f(x)\)的一个前缀,并且要让\(f(x)\)尽量短. 问在\(f^{10^{100}}(S)\)中,[L,R]中所有字符的出现次数. \[字符集为小写字母,|S|<=100000,1<=L<=R<=1e18\] 解法 可以发现的是S只用考虑前一半,因为进行…
对每个点的取值都取最小的可能值. 那个图最多一个环,非环的点的取值很容易唯一确定. 对于环上的点v,其最小可能取值要么是mex{c1,c2,...,ck}(ci这些是v直接相连的非环点)(mex是).要么是这个值+1. 并且如果环上的一个点的值确定了,其他的值也就唯一确定了. 那么就一共只有两种可能性,枚举一下即可.…
只有两维的时候,我们显然要按照Ai-Bi排序,然后贪心选取. 现在,也将人按照Ai-Bi从小到大排序,一定存在一个整数K,左侧的K个人中,一定有Y个人取银币,K-Y个人取铜币: 右侧的X+Y+Z-K个人中,一定有X人取金币,Y+Z-K个人取铜币. 现在,简化一下,我们把每个人的金币数和银币数减去其铜币数,然后默认取上所有人的铜币,这样不影响最终答案. 于是我们依次枚举K,计算前K个人中,银币数之和最大的Y个人,后X+Y+Z-K个人中,金币数之和最大的X个人,然后求和,更新答案. 可以用堆轻松实现…
假设我们一开始选取所有的运动项目,然后每一轮将当前选择人数最多的运动项目从我们当前的项目集合中删除,尝试更新答案.容易发现只有这样答案才可能变优,如果不动当前选取人数最多的项目,答案就不可能变优. 我这最外面那个二分是卖萌的. #include<cstdio> #include<set> #include<cstring> #include<algorithm> using namespace std; typedef pair<int,int>…
从大到小排序,相邻两项作差,求gcd,如果K是gcd的倍数并且K<=max{a(i)},必然有解,否则无解. 可以自己手画画证明. #include<cstdio> #include<algorithm> using namespace std; int n,K,a[100010]; int main(){ scanf("%d%d",&n,&K); for(int i=1;i<=n;++i){ scanf("%d"…
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. 可以通过搜索+剪枝解决. 我主要运用的剪枝有: 1.填了一位之后,可以立刻填出对称的另外一位. 2.看当前的rev(x)-x是否与给定的目标差距过远.…
题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1,V1),W2(T2,W2)\) 那么\(W1+W2((T1*V1+T2*V2)/(V1+V2),V1+V2)\) N<=500000 做法 首先我们要知道的是如果进水的水温递增, 那么肯定要保留的是最后L体积的水混合起来,新水温就是答案. 每天先放水,然后 加入进的水不递增,那么就混合最后两天的水…