随笔分类 -  POJ

摘要:dp HDU - 1257 最少拦截系统 最长递增子序列 HDU - 1029 Ignatius and the Princess IV HDU - 1069 Monkey and Banana POJ - 1458 Common Subsequence 最长公共子序列 dp[i][j] = 0 i 阅读全文
posted @ 2019-01-27 13:28 demianzhang 阅读(361) 评论(0) 推荐(0)
摘要:题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点。选择每个点有各自的利益或损失。求最大化的利益,以及此时选择人数的最小值。 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益。每个负点到t建边,容量为损失的绝对值。其他关系边容量正向无穷,反向0。正数点总和减去最小割即为最大权闭 阅读全文
posted @ 2018-06-27 16:52 demianzhang 阅读(391) 评论(0) 推荐(0)
摘要:题意:求全局最小割 不能用网络流求最小割,枚举举汇点要O(n),最短增广路最大流算法求最大流是O(n2m)复杂度,在复杂网络中O(m)=O(n2),算法总复杂度就是O(n5);就算你用其他求最大流的算法,算法总复杂度也要O(n4)。所以用网络流算法求解最小割集复杂度不会低于O(n4)。所以就要用St 阅读全文
posted @ 2018-06-26 20:28 demianzhang 阅读(476) 评论(0) 推荐(0)
摘要:题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条有向水渠,给出这n条水渠所连接的点和所能流过的最大流量,求从源点到汇点能流过的最大流量 Dinic 建图的另一种方法,上面有两种邻接表的方法,一种是单纯用数组模拟,可以运用异或操作反向边;另一个是vector模拟,反向边做特别记录 阅读全文
posted @ 2018-06-23 23:55 demianzhang 阅读(408) 评论(0) 推荐(0)
摘要:POJ 1364 题解:最短路式子:d[v]<=d[u]+w 式子1:sum[a+b+1]−sum[a]>c — sum[a]<=sum[a+b+1]−c−1 — (a+b+1,a) −c−1 式子2:sum[a+b+1]−sum[a]<c — sum[a+b+1]<=sum[a]+c−1 — (a 阅读全文
posted @ 2018-06-20 19:17 demianzhang 阅读(268) 评论(0) 推荐(0)
摘要:POJ1679 首先求出最小生成树,记录权值之和为MinST。然后枚举添加边(u,v),加上后必形成一个环,找到环上非(u,v)边的权值最大的边,把它删除,计算当前生成树的权值之和,取所有枚举加边后生成树权值之和的最小值 思路: 最小生成树唯一性判断,求次小生成树的val再与最小生成树比较。1.先用 阅读全文
posted @ 2018-06-15 20:43 demianzhang 阅读(214) 评论(0) 推荐(0)
摘要:题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次。 求最少明显用bfs,下面给出三种搜索算法程序: DFS: 注意visited结点,如果步数较小也继续搜索 A*算法: g函数为沿路径从起点到当前点的移动耗费(经过的步数),启发函数h为当前格子到终点横坐标差与纵坐 阅读全文
posted @ 2018-01-18 14:42 demianzhang 阅读(391) 评论(0) 推荐(0)
摘要:题意 Farmer John想从电话公司修一些电缆连接到他农场。已知N个电线杆编号为1,2,⋯N,其中1号已经连接电话公司,N号为农场,有P对电线杆可连接。 现给出P对电线杆距离Ai,Bi,Li表示Ai和Bi可连接,需要长度为Li的电缆。 电话公司赞助FJ K条免费电缆,额外的支出为剩下所需电缆的最 阅读全文
posted @ 2017-09-11 23:46 demianzhang 阅读(414) 评论(0) 推荐(0)
摘要:POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了。以此为条件进行第一重二分搜索,第二重二分搜索是对X的搜索,直接用lower_b 阅读全文
posted @ 2017-09-10 12:26 demianzhang 阅读(740) 评论(0) 推荐(0)
摘要:POJ 2976 题意 给n组数据ai,bi,定义累计平均值为: 现给出一个整数k,要求从这n个数中去掉k个数后,最大累计平均值能有多大?(四舍五入到整数) 思路 取n−k个数,使得累计平均值最大。 定义C(x)表示能否取得n−k个数,使得累计平均值≥x。然后二分搜索最大的x。 可以这样判断可行性: 阅读全文
posted @ 2017-09-09 15:42 demianzhang 阅读(662) 评论(0) 推荐(0)
摘要:POJ 2456 题意 农夫约翰有N间牛舍排在一条直线上,第i号牛舍在xi的位置,其中有C头牛对牛舍不满意,因此经常相互攻击。需要将这C头牛放在离其他牛尽可能远的牛舍,也就是求最大化最近两头牛之间的距离。 思路 二分搜索,现将牛舍排序,然后定义C(d),表示可安排的C头牛最近距离不小于d。 #inc 阅读全文
posted @ 2017-09-08 22:42 demianzhang 阅读(333) 评论(0) 推荐(0)
摘要:有N条绳子,它们长度分别为Li。如果从它们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留小数点后2位。 二分搜索。这里要注意精度问题,代码中有详细说明;还有printf的%.2f会四舍五入的,需要*100再取整以截取小数点后两位。 #include<stdio.h> #incl 阅读全文
posted @ 2017-09-08 16:10 demianzhang 阅读(428) 评论(0) 推荐(0)
摘要:题意: 思路: 对于每个幂次方,将幂指数的二进制形式表示,从右到左移位,每次底数自乘,循环内每步取模。 #include <cstdio> typedef long long LL; LL Ksm(LL a, LL b, LL p) { LL ans = 1; while(b) { if(b & 1 阅读全文
posted @ 2017-08-22 14:52 demianzhang 阅读(260) 评论(0) 推荐(0)
摘要:题意:给出a和p,判断p是否为合数,且满足a^p是否与a模p同余,即a^p%p与a是否相等 算法:筛法打1万的素数表预判p。再将幂指数的二进制形式表示,从右到左移位,每次底数自乘。 #include <cstdio> #include <cstring> typedef long long LL; 阅读全文
posted @ 2017-08-22 14:47 demianzhang 阅读(308) 评论(0) 推荐(0)
摘要:题意: H_Number 是一个比4的倍数多1的数,即4n + 1。H_Number 分为 H_Prime 和 H_Comosite。其中 H_Prime 仅能由1×h组成,而 H_Composite 除了1和h可有多个因子。H_Semi_Prime 表示仅有两个 H_Prime 因子(除了1和本身 阅读全文
posted @ 2017-08-21 23:33 demianzhang 阅读(306) 评论(0) 推荐(0)
摘要:题意:一条整数链,要求相邻两数前一个整除后一个。给出链尾的数,求链的最大长度以及满足最大长度的不同链的数量。 类型:因式分解+排列组合 算法:因式分解的素因子个数即为链长,链中后一个数等于前一个数乘以某素因子,所以链的数量即为这些因子不全相异的全排列数:A!/(a1!a2!a3!..) #inclu 阅读全文
posted @ 2017-08-21 22:59 demianzhang 阅读(476) 评论(0) 推荐(0)
摘要:题意:给两个四位素数a和b,求从a变换到b的最少次数,每次变换只能变换一个数字并且变换的过程必须也是素数。 思路:先打表求出四位长度的所有素数,然后利用BFS求解。从a状态入队,然后从个位往千位的顺序枚举下一个素数,入队,直到状态为b为止。 #include <cstdio> #include <q 阅读全文
posted @ 2017-08-21 21:27 demianzhang 阅读(594) 评论(0) 推荐(0)
摘要:题意:给出n,求不大于n的素数有多少个。 算法:先用线性时间复杂度的筛法打素数表,对于每个输入统计不超过的素数个数。 #include <cstdio> int p[100010]; bool np[1000010]; int cntp; void SievePrime(int n) { for ( 阅读全文
posted @ 2017-08-21 18:08 demianzhang 阅读(318) 评论(0) 推荐(0)
摘要:题意:给你一个循环小数,化成分数,要求分数的分母最小。 思路:暴力搜一遍循环节 把循环小数化分数步骤: 纯循环小数的小数部分可以化成分数,这个分数的分子是一个循环节表示的数,分母各位上的数都是9,9的个数与循环节的位数相同。能约分的要约分。 例: 这个分数的分子是第二个循环节以前的小数部分组成的数与 阅读全文
posted @ 2017-08-21 17:33 demianzhang 阅读(432) 评论(0) 推荐(0)
摘要:题意:求两数最大公约数和最小公倍数。 类型:辗转相除法 算法:gcd(a,b)=gcd(b,a%b),lcm(a,b)=a*b/gcd(a,b)。 #include <cstdio> #include <iostream> using namespace std; int gcd(int a, in 阅读全文
posted @ 2017-08-21 10:47 demianzhang 阅读(166) 评论(0) 推荐(0)