思路: 状态压缩 + dp. 实现: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; int t, n, m, s; ], S[], dp[][( << ) + ]; int dfs(int now, int s) { ) return dp[…
[题目链接]:http://hihocoder.com/problemset/problem/1486 [题意] [题解] 设f[i][j]表示前i个物品,每种属性的状态奇偶状态为j的最大价值; 这里用j的二进制对应每种属性的状态; 为1表示那种属性的物品个数为奇数否则为偶数 f[i][j] = max(f[i-1][j],f[i-1][j^zt[i]]+jz[i]); zt[i]是第i个物品拥有的属性的状态,jz[i]是第i个物品的价值 最后输出f[n][(1<< m)-1]就好; [Num…
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, r](0<= l <= r < n) <= val} >= k的最小的val即为第k小的区间价值. 在统计满足条件的区间个数的时候,可以用动态规划,令dp[i]表示v[0, i],则 dp[i+1] = dp[i] + {0~i-1位置a[i]出现的次数},再利用尺取法在迭代的过…
思路: 莫队算法+树状数组. 莫队算法的基本思想是对大量要查询的区间进行离线处理,按照一定的顺序计算,来降低复杂度.概括来说,我们在知道了[l, r]的解,并且可以通过一个较低的复杂度推出[l - 1, r], [l, r - 1], [l + 1, r], [l, r + 1]的解的情况下,则可使用该算法. 对该算法比较好的介绍: 1.https://blog.sengxian.com/algorithms/mo-s-algorithm 2.http://blog.csdn.net/bossu…
思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x, y; ]; ]; ] = { , , -, }; ] = { , , , - }; void init(int n) { ; i < n; i++) { ran[i] = ; par[i] = i; } } int find(int x) { if (par[x] == x) return x; r…
思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: #include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; ], ci[], co[]; bool check(int pos, int a, int b, int c) { &…
[题目链接]:http://hihocoder.com/problemset/problem/1487 [题意] 中文题 [题解] 岛屿的数目对应了这个图中联通块的数目; 面积则对应有多少个方块; 周长...周长就是周长 每次新增加一个方块的时候; 对于联通块; 把每个坐标转换成一维的数字; 然后写个并查集; 对于周长; 查看这个格子周围4个格子; 如果有格子和它相邻; 则那一面不会算在周长里面; 则减掉; 如果没有格子相邻则加上一个单位的周长 [Number Of WA] 0 [完整代码] #…
[题目链接]:http://hihocoder.com/problemset/problem/1488 [题意] 中文题 [题解] 莫队算法+树状数组; 首先贪心地知道,应该按照时间从小到大的顺序打水; 可以发现; 新增加一个人打水的话,对时间小于它的人打水没有影响; 只对时间大于它的人打水的时间有影响; 具体的; 对于时间大于它的打水的人的个数*这个人打水的时间;是新增加的打水时间; 然后同时还要加上这个人单独打水的时间; 即在它前面(时间比它小的打水的人)的所有打水时间总和+这个人的打水时间…
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素,从小到大放在队列中,再把b按顺序放入另一个队列中,每次取出两队列中较小值即可. #include<bits/stdc++.h> using namespace std; typedef long long ll; ]; queue<int>q1, q2; vector<int&g…
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望选择若干道不同的菜品,使得总价在不低于X元的同时尽量低. 你能算出这一餐小Ho最少消费多少元吗? 输入 第一行包含两个整数N和X,(1 <= N <= 20, 1 <= X <= 100) 第二行包含N个整数A1, A2, ..., AN.(1 <= Ai <= 100)…