摘要:
题目链接 #题目大意 给n个数找出其中任意几个数使其和能被n整除。 #解题思路 对n取模的结果是0~n-1,有n个数,显然是有解的,直接利用前缀和来求解符合条件的区间即可。 #代码 const int maxn = 1e6+10; const int maxm = 2e2+10; int arr[m 阅读全文
摘要:
题目链接 #题目大意 给n个向量从中选出k个向量,使得它们首尾连接与x轴成的面积的2倍最大。 #解题思路 首先我们观察图形可以发现,每新加一个向量,图像右上角的横纵坐标都会变化,而且计算面积的时候需要知道前面的纵坐标,所以我们可以dp图像的纵坐标,其值就是面积,然后取最大面积。既然是从n个数中选出k 阅读全文
摘要:
题目链接 #题目大意 给两个不同的字符串,比较其相似度,你可以在字符之间插入'-',不同字符之间的相似度参考题目中的表格。 #解题思路 这题主要还是考验对LCS的理解。定义dp[i][j]表示第一个串s1长度为i时与第二个串s2长度为j时的相似度(注意不算'-')。 我们在求dp[i][j]的时候, 阅读全文
摘要:
题目链接 #解题思路 这题的思路十分巧妙。首先,如果有多条等权值的路径的话,需要优先选择已经选好的那些路径,我们可以把每条边的边权都扩大k倍再加1,这样以来,选好的和没选的等边权的边就能区分开来,而且也不会影响不同边权的边的关系。 第二个问题就是怎么求改动的次数了,我们把原来的边权扩大k倍,只有选过 阅读全文
摘要:
题目链接 #解题思路 题目要求互相没有关系的最大集合,那么等于说t除最少的点,使剩下的点没有相互关系,也等于用最少的点覆盖所有关系,问题就转化成了求最小点覆盖问题了。 #代码 const int maxn = 5e2+10; const int maxm = 1e3+10; int n, vis[m 阅读全文
摘要:
题目链接 #解题思路 裸题,先用floyd传递闭包,这样如果道路的中间点被用过了,两边的点依然可以相互匹配,即实现了重点的路径。 #代码 const int maxn = 5e2+10; const int maxm = 1e3+10; int n, m, mp[maxn][maxn], match 阅读全文
摘要:
题目链接 #解题思路 题目要求用少的机器人访问所有的点,也是说找最少的路径访问所有的点,也就是最小路径覆盖问题。 题目的关键是如何建图,因为机器人只能向下走或者向右走,那么就在当前的垃圾点所在的行往下,每一列出现的第一个垃圾点之间建一条边即可。 #代码 const int maxn = 25; co 阅读全文
摘要:
题目链接 #解题思路 对原图做预处理,给横向的连通块和纵向的连通块编号,那么对于这个连通块内的点就有两个选择(x,y),这个点只有被其中一个覆盖就能被覆盖。所以结果就是求所有x->y的最大匹配,为什么呢?假设有一条边x_i → x_j,如果两点不能匹配,说明其中一个已经匹配上了,根据前面所说的,只要 阅读全文
摘要:
题目链接 #解题思路 因为每行每列只能放一个棋子,所以这就是一个匹配问题,每一行最多就只能匹配一列。题目问那些棋子去掉之后最大匹配数会变少,直接枚举就行了。 #代码 vector<int> e[maxn], re[maxn]; int deep[maxn], sz[maxn], rec[maxn]; 阅读全文
摘要:
题目链接 #解题思路 经典的逆向思维,题目数据的特殊性提示我们利用好k只有100的条件。 每次用bfs把所有编号相同的点作为搜索的起点,根据bfs的性质,每个点第一次被访问的时的距离就是它离起点最近的距离。然后对于每个点,选出前s大即可。 #代码 const int maxn = 1e5+10; s 阅读全文