摘要:
题意 一个序列 a_1,a_2,..,a_n, 求最长子序列,满足 low <= max{ai}-min{ai} <= high.解题思路 首先考虑区间 [i,j], 我们可以通过固定右边界,来实现区间的滑动.以求解最佳值. 我们首先观察题目要求 low <= max{a_i,a_j}-min{a_i,a_j} <= high. 假定我们固定了右边界, 令 d = max{a_i,a_j} - min{a_i,a_j} 意味着我们只能移动 左边界i, 对于左边界的移动会导致两种情况 1. max{ a_i.a_j } 下降 2. min{ a_i, a_j } ... 阅读全文
摘要:
Just a note because of a failure understand for the Path Cover 以下内容均来自:http://en.wikipedia.org/wiki/Path_cover 对于有向图 G Belong (V,E), 一个路径覆盖就是:一个由多条有向路径组成的集合,并且每一个顶点 v Belong V, 其至少(同时也至多)属于一条路径. 注意,一个路径覆盖可能包含路径长度为0的情况.(单个顶点时). 路径覆盖也能够定义为: 一个不相交的路径覆盖. 一个由多条路径组成的集合,每一个顶点 v Belong V 都准确的属于一条路径. ... 阅读全文
摘要:
题意 N个人,其中包含男女,然后某些男女之间有关系。现要求找出最大的K人,其之间两两无关系。解题思路 最大独立子集问题。 题意是求最大独立集,但是N太大(其实也不大,就是数据好强,KB算法T了), 因为男女生有边,男男或者女女之间不会有边,所以理论上将男女分开,然后就形成二分图了. 但是,男女情况不明....我是将N个看成一个集合,与其自身匹配. 拆点将N个人看成 集合A{N},与集合B{N},然后求最大匹配, 结果即为最大独立集 : N - 最大匹配/2#include<stdio.h>#include<stdlib.h>#include<string.h> 阅读全文
摘要:
---恢复内容开始---题意 N*N的土地,某些点被挖成池塘了,其余为空地, 现在要组织成1*2的空地出售,问最大能出售的数量。解题思路 因为 R*C - K <= 50 意味着,去除掉池塘后最多只有50个空地 每个顶点与其上下左右的空地 连接,然后 构成二分图。 转换成求最大独立边(任意两条边不共用相同顶点)即为最大匹配。#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 110;int r, c, n, m, k;bool g[N][N], use[N][N];int 阅读全文
摘要:
题意 P个课程,N个学生,之间有边连接,问是否可以 P个学生选择不同的P个课程。解题思路 最大匹配#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 310;int p, n;bool g[110][310];int ma[N], mb[N];bool vis[N];int path( int u ){ for(int v = 1; v <= n; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( m... 阅读全文
摘要:
题意 两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下.问最小的 切换模式次数.解题思路 A, B 两个天然二分图顶点集合, A,B机器上的两个模式之间连边即为 作业K. 最小的切换次数, 即为 最小顶点覆盖数. 特殊的定理是, 二分图中 最小顶点覆盖 = 最大匹配. (仅仅在二分图中满足. 主要是由于最大独立点集导致)#include<stdio.h>#include<string.h>#include<stdlib.h>const int N = 110;int n, m, k;int 阅读全文
摘要:
题意, N*N 矩阵, 有些地方有行星, 现有一种武器能够攻击一行, 或者一列,问最少攻击次数.消灭所有行星解法. 因为要消灭所有顶点, 同一行中的顶点能 一次 消灭, 同一列的顶点也能 一次 消灭. 我们需要 最小的 攻击次数, 则意味着 最小的攻击次数消灭 所有顶点. 将所有存在行星的顶点(x,y), 按x, y轴分别作为 A,B顶点集合,转换成二分图. 这样 A,B集合连边的代表一次 攻击 箭支 能消灭的行星, 则题目所求就转换成了. 最小的顶点 覆盖所有边, 既 最小顶点覆盖 问题. 又因为, ( 在所有图中都满足) 最小顶点覆盖 + 最大独立子集 = 顶点数... 阅读全文
摘要:
问题 p_i != i and p_i != i+1思路 PS: \sum_{k=0}^n(-1)^k(n-k)!(2n)/(2n-k)\binom{2n-k}{k} 设E_i表示 p_i=i 的{p_n}数量 F_i表示 p_i=i+1 的{p_n}数量 把E,F排成一圈,E_1,F_1,E_2,F_2,…,E_n,F_n 那么,相邻两个集合的交是空 然后证一个引理,在这2n个集合里面挑出k个,两两不相邻的方案数,就是 //psbinomial 二项式 最后套上容斥,就得到想要的,引理很好证 引理证明,继续往后翻聊天记录ftiasch(826513189)16:41:... 阅读全文
摘要:
题意 N*M矩阵,有空地('o')、草地('*')、墙('#‘),机器人能攻击到上下左右,不被墙挡住的方位。并且机器人只能被放置在空地上。问能放置的最大数量机器人,相互间不能攻击到。解题思路 对于所有空地,能够攻击到的相互之间冲突,即可连接成边,然后题目就转换成了 最大独立集问题。但是本题 顶点数量为 50*50 = 2500, 果断TLE。 另外我们可以发现,通过 将每一行相互攻击到的空格位置看成一个点,这些点命名为 {A} 将每一列相互攻击到的空格位置看成一个点,这些点命名为 {B} 则图就转换了二分图, 对于 顶点集 {A} 与 {B} 而言, 之 阅读全文
摘要:
题意 有N根棍子,分别有长度。问将其拼接成X根,长度相同,求最小长度。解法 搜索。 1.因为总共n根棍子,最多拼接成n根相同长度, 并且,组成的棍子数量越多,则长度则越小 2.拼接的棍子数量必定能够 被 \sum{stick_i} 整除 3.若当前棍子长度 stick_i 不能够匹配, 在 stick_i = left_len 或者 stick_i = target_len 情况下, 此长度无合法方案, 因为每一根棍子都将被使用,若有一根不能被使用,则此长度方案必定不能成立.View Code #include<cstdio>#include<cstring>#incl 阅读全文