POJ
北京大学oj刷题中
饮闲
写作是门孤独的手艺,意义却在于分享
展开
-
折半枚举(双向搜索) —— 4 Values whose Sum is 0 POJ - 2785 题解
题目链接https://vjudge.net/problem/POJ-2785题目简述有ABCD四个数组,从每个数组中选取出一个元素,求和为0的所有组合总数。题目解析每个都枚举肯定是不行的,复杂度O(n^4).可以考虑独立出一个来,然后求A+B+C的和,然后对D排序,二分搜索D的值,复杂度O(n^3 * log(n)),不太够,再度优化可以看成 a + b = - c - d先求C+D的和,看做一个新的数组cd,对cd排序然后枚举A+B,再二分搜索cd的值,时间复杂度O(n^2原创 2021-08-04 17:07:25 · 191 阅读 · 0 评论 -
Physics Experiment POJ - 3684 题解
题目链接https://vjudge.net/problem/POJ-3684题目分析从高度为H的地方开始放球,每一秒放一个球,球的半径为R,不考虑空气阻力,球直接为弹性碰撞,无动量损失。g = 10 m / s^2题解根据题目,当一个球的时候,球自由落体,所需要的时间为 t = 根号下(2*H/g)可以轻松的求出球撞击地面之后,由于没有空气阻力,并且做弹性碰撞,球会回到原处,且所花费的时间也为t。所以当 T / t = k,k为偶数的时候,球相当于做(T - kt)时间内的自原创 2021-08-03 10:38:56 · 198 阅读 · 0 评论 -
Fliptile POJ - 3279 题解优美的暴力
题目链接https://vjudge.net/problem/POJ-3279拿到这道题想了很久,都没找到什么好的做饭,一看题解,好家伙,直接暴力是没想到的,一看数据最多才15行15列,之间暴力就OK了。首先,暴力第一行的所有可能性,2的15次方,大概32768种可能性。只要第一行确定下来了,之后的情况都可以之间根据上一行来锁定出下一行,然后确定出整个矩阵的最优解。注意,同样踩踏次数的可能性下,要选择字典序最小的那种踩踏情况,所以要从最小的数0开始,一直确定到最大的数2的15次方。AC代码原创 2021-08-02 16:58:10 · 258 阅读 · 0 评论 -
Face The Right Way POJ - 3276 题解
题目链接https://vjudge.net/problem/POJ-3276开关问题K为反转块的大小,M为反转的次数(要求在最小的反转次数内,选择最小的反转块)我们,首先从小到大遍历所有的单位块K,这样能保证在选择最小的反转次数M的同时,只会保留最小的块数K。对于每一个可能的K值,如果能满足条件,则turn函数返回需要反转的次数,如果反转的次数比当前值要小,则更新最小的M,因为K是保证在最小M前提下的K,所以也要同时更新K值。在turn函数的每一次处理中,以块为单位的思想进行推进,记原创 2021-08-02 15:01:57 · 221 阅读 · 0 评论 -
Jessica‘s Reading Problem POJ - 3320 题解 双指针,set,map
题目链接https://vjudge.net/problem/POJ-3320代码#include <iostream>#include <set>#include <map>using namespace std;int P;const int MAX_P = 1000000;int a[MAX_P];void solve(){ set<int> all; for (int i = 0; i < P; +原创 2021-08-02 12:51:26 · 198 阅读 · 0 评论 -
POJ 3061 Subsequence 题解 法一: 二分 + 遍历 法二:双指针
代码#include <iostream>#include <algorithm>using namespace std;int N, S;const int MAX_N = 100000;int A[MAX_N];int sum[MAX_N];void solve(){ sum[0] = A[0]; for (int i = 1; i < N; ++i) { sum[i] = sum[i - 1] + A[i]; } int res =原创 2021-07-30 17:29:24 · 201 阅读 · 0 评论 -
Aggressive cows POJ - 2456 题解
题目链接点击这里代码#include <iostream>#include <algorithm>using namespace std;int N, M;const int MAX_N = 100000;int X[MAX_N];bool try_place(int mid){ int pre = 0; int cnt = 1; for (int i = 1; i < N; ++i) { if (X[i] - X[pre] >= m原创 2021-07-30 15:34:46 · 213 阅读 · 0 评论 -
Cable master POJ - 1064 题解
题目链接https://vjudge.net/problem/POJ-1064当然我是在Virtual Judge上面写的,可以直接去POJ去提交。这个题目感觉并不是很困难的样子,主要就是一个二分的思想,之前写的时候,主要是结尾判断的时候,没有向下取整,直接四舍五入的,导致一直提交失败,甚至写了不只一个版本的代码。下面,我随便给出两个版本的结果,都能过。#include <iostream>#include <cstdio>#include <cmath>原创 2021-07-30 10:03:42 · 394 阅读 · 1 评论 -
POJ 2029 二维树状数组
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int max_N=500+1;int bit[max_N][max_N];int n,m;int lowbit(int x){ return x&(-x);}void update(int x,int y,int val){ for(int i=x;i<原创 2020-10-28 19:13:52 · 201 阅读 · 0 评论 -
Hopcroft-Karp算法 poj-1469 COURSES
Hopcroft-karp算法该算法由John.E.Hopcroft和Richard M.Karp于1973提出,故称Hopcroft-Karp算法。使用情形给定一个二分图,求其最大匹配。原理简述在增广匹配集时,每次寻找多条增广路径,以进一步减少时间复杂度。步骤及示例演示dx【】、dy【】分别表示二分图左右不顶点的距离标号mx【】、my【】分别表示二分图左右部顶点的距离标号1、我们每次从所有未匹配的左部节点开始BFS,进行距离标号。2、对于每一个队列中的左部节点X,考虑与它相邻的所有原创 2020-08-16 17:17:12 · 590 阅读 · 0 评论 -
Tarjan算法 POJ2186
题目链接 点击这里Tarjan算法适用情形有向图,求强连通分量。此题中,以Tarjan算法为基础,求解并标记了相应的连通分量,并通过各连通分量出度的分析,找到相应的缩点,并根据缩点的个数,做出相应的处理。原理简述Tarjan算法基于对图的深度优先搜索算法,每个强连通分量,都是搜索树中的一颗子树,并在回溯时,判断是否为强连通分量。算法的实现过程,类似于基于后续的深度优先搜索与并查集的组合。步骤dfn【i】:记录节点i在深度优先搜索中的访问次序low【i】:记录节点i可以到达的访问时间最早的祖原创 2020-08-15 16:07:20 · 243 阅读 · 0 评论