[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑r最后的二进制形式为 1xxxxx 那么我们肯定想让第一个最高位的1保留. 因此我们选取的另外一个数字 一定是 0xxxxx的形式. 那么我们贪心地选取数字b=01111..1 然后看看这个数字b是否大于等于L 如果满足,显然它也是满足小于等于R的. 那么我们选取的a=100000..0 那么结果显然就是最大的了.为11111...11 但是 如果b<L 那么我们就显然不能满足最后的结果第一位是1了. 所以b的第一位也只能是…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑. 如果有放的话.枚举前一个位置的颜色以及前i-1个位置形成的联通块的数目 如果没有放的话.枚举当前以及前一个的颜色以及前i-1个位置形成的联通块数目 有放不用加代价. 没有放的话加上放的代价就会. 最后在f[n][1..m][k]里面找最小值 [代码] #include <bits/stdc++.h>…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 很显然只要维护B,R,G的数量就好了. 可以很容易想到一个dfs(int a,int b,int c) 然后如果a+b+c==1,那么让其中为1的对应的颜色标记为可以得到就好 变换就是a-1,b-1,c+1和a-1,c-1,b+1以及b--,c--,a++以及a-1,b,c和a,b-1,c和a,b,c-1 然后加一个记忆化搜索吧.. [代码] #include <bits/stdc++.h> #define LL long l…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最多1000行的样子. 从上到小做dp 设f[i][j]为前i行,使用了j个红色方块的方案数. f[1][r] = 1;如果r>0且g>0则f[1][r-1]=1; 然后如果第i+1行不用红色的话.->就只能用绿色了.. 算算绿色够不够填i+1个.. 够得话 f[i+1][j] = f[i+1][j] + f[i][j]; 然后看看红色够不够填i+1个 够得话 还可以用红色填i+1行 也即 f[i+1][j-(i+1…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每一位显然只要取1..60这些数字. 然后需要保证每个这些数字里面,每个数字所用到的质因子都它所唯一拥有的.别人不能用 因为如果别人用了的话.gcd就不为1了. 因此我们肯定需要记录这些数字的质因子使用情况. 如果第i个位置枚举的数字,它里面的某个质因子,之前用过了.那么这个数字就不能用. 否则还可以用. 只需取前16个质数就能够表示1..60这些数字了 (其实只要取到58就好了,所以59这个质数不用,因为选59和选1的代价是一…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意这k个序列每个都是排列. 如果在每个序列中都满足y出现在x之后的话. 那么我们从x连一条有向边至y (有一个序列不满足就不连 (这就表明最后的序列中x可以紧接着y 最后显然会形成一个有向无环图. 在这个图上求最长链就好了. 可以在做拓扑排序的时候边做这个dp. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原题意等价于:给你一个序列(实数的位置没用!)..你可以改变其中某些元素的位置(插入到某些位置中间. 然后让他变成有序的. (有序的话,相同的数字就连在一起了 那么求出原序列的一个最长上升子序列. 把除了这个子序列之外的数字再分别插入到这个最长上升序列中就可以变成升序了. 这样是执行插入次数最少的做法. 答案就是数组长度减去最长上升子序列的长度了. [代码] #include <bits/stdc++.h> #define L…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 首先. 这张图是无向无权图. 因此任意两点之间的最短路可以通过N^2的bfs轻易算出来. 即得到d[N+10][N+10] 考虑s[0]->t[0]的最短路以及s[1]->t[1]的最短路 如果d[s0][t0]>l0或d[s1][t1]>l1那么直接输出无解 假设他们俩的最短路之间没有重合的部分. 那么m-d[s0][t0]+d[s1][t1]就是答案.因为剩下两条最短路肯定最好的情况了. 删掉的肯定是最多的.…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二维费用背包. f[i][j][k] 前i个人,写了j行,bug不超过k的方案数. 可以把每个人看成是一个物品. 它可以无限拿.然后花费为 1行代码和a[i]个bug (拿几个第i个人就相当于v[i]等于几. 就变成一个二维的完全背包了 直接用二维费用背包的方案数求法求得就好 两维的写法比三维的写法简单..直接顺序更新就可以了 (顺序更新) [代码] #include <bits/stdc++.h> using namespa…
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 第i只动物如果饲养它的话. 代价是固定的就是(n-i+1)a[i] 所以相当于给你n个物品,每个物品的重量为(n-i+1)a[i],价值为1 背包容量为x 问你最大价值是多少. 但因为价值是单位价值. 所以直接重量小的优先选就好了. 不够了就停止. [代码] #include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i &l…