随笔分类 - 洛谷
摘要:一.Olympiad in Programming and Sports - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) (1)题意: (2)解题思路 考虑按编程能力从大到小排序,先选完编程团队中的p个人,然后再考虑体育团队的s人, 考虑维护3个优先队列,一个是a[i]的大根堆,一
阅读全文
摘要:一、题目描述 二、解题思路 这个题主要注意一下会输入重复的边,你在存图时取个最小边权就行了 三、代码实现 1 #include "bits/stdc++.h" 2 const int inf = 1e9 + 10; 3 using namespace std; 4 int graph[5010][5
阅读全文
摘要:一、题目描述 二、解题思路 首先把这些点的距离预处理出来,然后把给定的边的权值设置为0。那么这些给定的边一定会被走到,然后根据短的再进行选就行了,因此可以用prim算法来做这个题,当然可以用堆优化,但是数据量比较小,所以就没有用堆优化了。(这里很容易出错,debug两个小时在一个double型的mn
阅读全文
摘要:一、题目描述 二、解题思路 一个kruscal模板题,只需要把最大的排在前面数k条就行了。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int n,m,k; 4 int a[100010]; 5 struct node{ 6
阅读全文
摘要:一、题目描述 二、解题思路 首先预处理出路径长度,标记点。然后,因为只能装s个,所以答案就在前面p - s条路径中最长的那条,因为我后面那p - s + 1之后的只会导致答案变大,这里有点点贪心的思想,所以答案就只能是前面p - s中最大的那条就行了。 三、代码实现 1 #include "bits
阅读全文
摘要:一、题目描述 二、解题思路 利用kruscal算法求解,原来一共有n个点,看看能不能缩成k个点,如果能就输出ans,如果不能输出No Answer。因为kruscal是从最小的边开始,所以答案肯定是最小的,符合正确性。 三、代码实现 1 #include "bits/stdc++.h" 2 usin
阅读全文
摘要:一、题目描述 二、解题思路 Floyd模板题 三、代码实现 1 #include "bits/stdc++.h" 2 long long dp[1100][1100]; 3 const int inf = 1e9; 4 using namespace std; 5 int main() 6 { 7
阅读全文
摘要:一、题目描述 二、解题思路 Dijkstra模板题 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int inf = 1e9 + 10; 4 int graph[2510][2510]; 5 int n,m,s,t;
阅读全文
摘要:一、题目描述 二、解题思路 floyd模板题 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int inf = INT_MAX; 4 long long dp[110][110]; 5 int rd[11000];
阅读全文
摘要:一、题目描述 二、解题思路 Dijkstra的优化版,时间复杂度用优先队列优化,空间复杂度用链式前向星优化。(标准版直接交就行了) 三、代码实现 1 #include "bits/stdc++.h" 2 #define PII pair<long long,long long> 3 using na
阅读全文
摘要:一、题目描述 二、解题思路 tarjan求割边模板题,用个答案数组存答案,求出来后排序就可以了。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int G[200][200]; 4 int low[200],dfn[200],t
阅读全文
摘要:一、题目描述 二、解题思路 Dijkstra模板题,套模板即可。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int inf = 1e9; 4 int dis[210],vis[210]; 5 int graph[
阅读全文
摘要:一、题目描述 二、解题思路 数据量不大,直接暴力枚举即可,计算最大的答案。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int main() 4 { 5 char s1[110],s2[110]; 6 cin >> s1 >>
阅读全文
摘要:一、解题思路 哈希模板题,我用map解决了 二、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 map <string,int> ans; 4 string temp; 5 int cnt; 6 int main() 7 { 8 in
阅读全文
摘要:一、题目描述 二、解题思路 给出了c是已知,然我们求A和B是否存在,把等式变换一下,A = C + B,然后用hash判断即可,当然我用的是map(stl大法好),防止重复的没有被加到。 三、代码实现 1 #include <bits/stdc++.h> 2 using namespace std;
阅读全文
摘要:一、题目描述 二、解题思路 这个题的数据量有点大,考虑hash,然后就用了set,(stl大法好) 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 set <string> ans; 4 set <string> ans2; 5
阅读全文
摘要:代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 const int maxn = 1e6; 4 char s1[maxn + 10],s2[maxn + 10]; 5 int nextval[maxn + 10]; 6 int ans
阅读全文
摘要:一、题目描述 二、题目分析 这个题目挺有意思的,刚开始以为是个并查集的模板题,后面交上去只有36分,仔仔细细看了一下题,发现这并不是双向关系,而并查集是双向的。因此我就想了一个有疑问的想法,在合并祖先的时候,把那些祖先不等于自己的标记一下,最后计算祖先等于自己的或者未被标记的加上去就行了,虽然是10
阅读全文
摘要:一、题目描述 二、题目分析 如果n个村庄要想通村,而这个公路又是双向的,那么就只需要n-1条边就行了,因此我们只需要解决的问题就是时间最少的问题了,我们只需要按时间进行一个快排就行了,然后判断是否拿到了n-1条边,拿到了就更新ans推出循环就行了,如果修完了m条路都没有n-1条边,那么就不能通车,输
阅读全文
摘要:一、题目描述 二、题目分析 这个题目我觉得题意有点问题的,后面把并查集的模板改成等于就行了,也就是计算两个公司认识1号人的人数取个最小值,因为你不可能凭空造人,对吧? 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 int a[1
阅读全文