![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
一条ACM咸鱼的自我修养
裤头Kt
这个作者很懒,什么都没留下…
展开
-
LightOJ-1033-Generating Palindromes
题目传送门题意:求这个字符串最少添加几个字符可以成为一个回文串。思路:动态规划, dp[i][j]表示第i个字符到第j个字符最少添加的字符数使其成为回文串。#include <bits/stdc++.h>using namespace std;int main(void){ int T, cas=1; scanf("%d", &T); while (T--) {原创 2017-10-21 10:50:27 · 288 阅读 · 0 评论 -
HDU-2389-Rain on your Parade [二分匹配][Hopcroft-Carp]
题目传送门题意:有n个人的坐标和速度,有m个伞的坐标,问有多少人能在t秒内到伞底下,一个伞底下只能有一个人。思路:二分匹配,用匈牙利算法无限超时,又改用邻接表还是超时,最后查资料才知道处理数据较大的二分匹配需要用Hopcroft-Carp算法。Hopcroft-Carp算法模板:/* *********************************************二分图匹配(Hopcro原创 2017-08-24 08:53:38 · 455 阅读 · 0 评论 -
LightOJ-1006-Hex-a-bonacci
题目传送门题意:对递归函数进行优化。思路:易知此递归函数为一递推式,即数组第K个数为第K-6个数到第K-1个数之和,可以用循环写。#include <bits/stdc++.h>using namespace std;const int mod = 10000007;int f[10000+1000];int main(void){ int T, cas = 1; scanf(原创 2017-08-27 20:40:07 · 273 阅读 · 0 评论 -
LightOJ-1005-Rooks [组合数学]
题目传送门题意:N*N的棋盘放K个车,一个车所在的行列不能有第二个车,求有多少种放法。思路:简单组合数学,如果K>N则不可能放下。K<=N有C(N,K)*C(N,K)*K!表示从N行中选K行,从N列中选K列,然后全排列。#include <bits/stdc++.h>using namespace std;long long C[40][40];void init (){ for (in原创 2017-08-27 20:37:42 · 238 阅读 · 0 评论 -
LightOJ-1004-Monkey Banana Problem [DP]
题目传送门题意:给定一个菱形的阵列,每次只能向左下或者右下移动,问从最上边走到最下边数字之和最大为多大。思路:DP,可以分解成两个数塔。#include <bits/stdc++.h>using namespace std;int dp[210][210];int main(void){ int T, N, cas=1; scanf("%d", &T); while (T原创 2017-08-27 20:12:26 · 282 阅读 · 0 评论 -
LightOJ-1003-Drunk [拓扑排序]
题目传送门题意:给定一些酒和一些顺序,如果想喝B酒必须先喝A酒。问可不可以喝完所有的酒。思路:拓扑排序,用map存出现过的字符串。#include <bits/stdc++.h>using namespace std;int head[21000],ans;int book[21000],m;struct node{ int next; int to;}edge[21000原创 2017-08-27 20:08:47 · 262 阅读 · 0 评论 -
LightOJ-1002-Country Roads [最短路][Dijkstra]
题目传送门题意:给定无向图,求一个城市t到其他城市的最低成本,成本的定义为路径中的最大消费。思路:这个题跟POJ-2253-Frogger类似,可以用Dijkstra算法变形来写。也可以用kruskal来写。#include <bits/stdc++.h>using namespace std;int n, m;int mp[550][550];const int INF = 0x3f3f3f3原创 2017-08-27 20:03:41 · 306 阅读 · 0 评论 -
LightOJ-1001-Opposite Task
题目传送门题意:输入T组数据,每组数据一个数,将这个数字分解成两个数字之和,要求这两个数字范围为[0,10]。#include <bits/stdc++.h>using namespace std;int main(void){ int T; scanf("%d", &T); while (T--) { int n; scanf("原创 2017-08-27 19:58:43 · 298 阅读 · 0 评论 -
LightOJ-1000-Greetings from LightOJ
题目传送门题意:输入T组数据,每组数据两个数,输出这两个数的和。#include <bits/stdc++.h>using namespace std;int main(void){ int T, cas = 1; scanf("%d", &T); while (T--) { int x, y; scanf("%d %d", &x,原创 2017-08-27 19:55:59 · 270 阅读 · 0 评论 -
HDU-2819-Swap [二分匹配][输出路径]
题目传送门题意:给定一个只有0 1的矩形,问能否通过交换行列使对角线上的数全为1,如果可以输出交换的路径。思路:首先通过匈牙利算法算出最大匹配,如果最大匹配数不等于矩阵的行数,则必然不会成功。只交换行,或者只交换列都可以交换出来。#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#includ原创 2017-08-23 09:17:32 · 256 阅读 · 0 评论 -
HDU-1281-棋盘游戏 [二分匹配][关键匹配]
题目传送门题意:给定二分图求最大匹配数和关键匹配数。思路:先通过匈牙利算法求最大匹配数,然后遍历二分图,去掉一条边之后再用匈牙利算法算匹配数,如果小于最大匹配数,则这个边为关键点。#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmat原创 2017-08-23 08:42:27 · 202 阅读 · 0 评论 -
POJ-3660-Cow Contest [最短路][Floyd]
题目传送门题意:给出许多牛之间的强弱关系,问可以确定多少牛的名次。思路:用Floyd,如果一头牛与其他N-1头牛的关系确定,即这头牛的名次就固定。#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <queu原创 2017-08-22 08:45:20 · 330 阅读 · 0 评论 -
HDU-2444-The Accomodation of Students [二分匹配][判断二分图][BFS染色法]
题目传送门题意:给定n个学生,学生之间可能互相认识。首先需要判断能不能将学生分成两组,使组内学生互相不认识。然后将学生两两分组,保证每一组学生都认识,求最大组数。思路:交叉染色法判断是不是二分图,然后二分匹配模板。交叉染色法:首先将一个节点染色,然后将与此相连的节点全部染成另一种颜色,如果有相连节点颜色相同则不是二分图。可以用BFS/DFS写。#include <algorithm>#includ原创 2017-08-22 09:23:18 · 240 阅读 · 0 评论 -
POJ-1502-MPI Maelstrom [最短路][Dijkstra]
题目传送门题意:给出一个无向图表示第i行为第i+1个主机与前i个主机之间的通信时间,’x’为不通,求从1号主机向所有主机发消息全部接受到的最短时间。思路:Dijkstra模板题,最后遍历一遍求最大值。#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#inc原创 2017-08-21 09:48:54 · 246 阅读 · 0 评论 -
POJ-3259-Wormholes [最短路][BellmanFord]
题目传送门题意:利用虫洞进行时间旅行,问是否可以碰到以前的自己。输入为M条双向边和W条单向边。双向边表示农夫从一个虫洞走到另一个虫洞需要的时间,单向边表示可以从虫洞穿越到另一个虫洞,并回到T秒前。思路:BellmanFord求负环。难在理解输入。#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>原创 2017-08-21 09:37:06 · 236 阅读 · 0 评论 -
POJ-1860-Currency Exchange [最短路][BellmanFord]
题目传送门题意:一个城市有许多交换点,可以将货币a兑换成货币b,有响应的汇率,需要支付一定的佣金。现在有一些钱,求能否增加钱。 输入a,b,c,d,e,f分别为ab为两种货币,c为a到b的佣金,d为a到b的汇率,e为b到a的佣金,f为b到a的汇率。思路:BellmanFord求正环。如果存在正环则钱会一直增加。#include <algorithm>#include <iostream>#in原创 2017-08-21 09:26:35 · 252 阅读 · 0 评论 -
POJ-3268-Silver Cow Party [最短路][Dijkstra]
题目传送门题意:奶牛们要去一号农场参加派对,每只牛必须从自己农场走到1号农场,聚会结束再返回农场,奶牛走的都是最短路径。求来回最长时间。图为有向图。思路:先用Dijkstra求一遍最短路,然后反转图,再求一遍最短路,两者之和就是每头牛来回所走的时间之和,求最大值。#include <algorithm>#include <iostream>#include <cstdlib>#include原创 2017-08-21 09:19:06 · 270 阅读 · 0 评论 -
POJ-3020-Antenna Placement [二分匹配][最小路径覆盖]
题目传送门题意:一个地图由o和*组成,一个信号塔可以覆盖两个连续的*。问至少需要多少个信号塔才能覆盖所有的*。思路:先将所有的’*’hash,然后建立二分图,用匈牙利算法算出最大匹配数。最小路径覆盖数 = 顶点数 - 最大匹配数#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include原创 2017-08-24 10:13:08 · 286 阅读 · 0 评论 -
LightOJ-1007-Mathematically Hard [欧拉函数]
题目传送门题意:求下从a到b的所有数的欧拉函数的平方和。欧拉函数:小于n的与n互质的数的个数。思路:预处理筛选,求前缀和。#include <bits/stdc++.h>using namespace std;unsigned long long ans[5000100];void init(){ ans[0] = 0; ans[1] = 1; for (int i =原创 2017-08-28 15:38:05 · 245 阅读 · 0 评论 -
LightOJ-1009-Back to Underworld [二分图染色]
题目传送门题意:给定n种对立关系,求一方的人最多有多少个。思路:二分图染色问题。如果当前节点为一种颜色,则与之相连节点全部都为另一种颜色。统计两个颜色个数,取最大值。#include <bits/stdc++.h>using namespace std;struct node{ int to, next;}edge[201000];int head[100000+1000], cnt;原创 2017-08-28 15:49:48 · 329 阅读 · 0 评论 -
LightOj-1030-Discovering Gold
题目传送门题意:有一个六面体骰子,每投一次就往前走多少格,并可以获得格子上的金币,求走到最后可以获得的金币数的期望。思路:当前点的期望P[i] = A[i]+(P[i-1]+P[i-2]+P[i-3]+P[i-4]+P[i-5]+P[i-6])/6,如果不够六格, 则为P[i] = A[i]+(P[i-1]+P[i-2]+P[i-3]+…+P[i-n])/n。#include <bits/stdc+原创 2017-10-21 10:47:08 · 377 阅读 · 0 评论 -
LightOj-1029-Civil and Evil Engineer
题目传送门题意:给定一个无向图,求他的最小生成树与最大生成树的平均值。思路:用Kruskal正着求最小生成树,再倒着求最大生成树。#include <bits/stdc++.h>using namespace std;struct node{ int x, y, w;}edge[30000];int cnt;int n;int fa[15000];int cmp1(node a,原创 2017-10-21 10:41:01 · 256 阅读 · 0 评论 -
LightOj-1028-Trailing Zeroes (I)
题目传送门题意:给定一个N,求有多少种进制表示N存在后导0。比如2的二进制为10。思路:求N有多少个因子。#include <bits/stdc++.h>using namespace std;long long num[100000];int book[1000100];int len;void init(){ num[0] = 1; memset(book,0,sizeo原创 2017-10-21 10:38:00 · 241 阅读 · 0 评论 -
LightOj-1024-Eid
题目传送门题意:求N个数的最小公倍数。思路:结果比较大,需要用大整数去写。#include <bits/stdc++.h>using namespace std;struct bigInt{ int num[2000], len; void clear() { len=0; memset(num, 0, sizeof(num)); }原创 2017-10-21 10:33:27 · 263 阅读 · 0 评论 -
LightOj-1023-Discovering Permutations
题目传送门题意:输出A-Z里面前N个字母的全排列的前K个。思路:使用next_permutation()函数。#include <bits/stdc++.h>using namespace std;int main(void){ int T,cas=1; scanf("%d", &T); while (T--) { int n, k;原创 2017-10-21 10:31:10 · 281 阅读 · 0 评论 -
LightOj-1022-Circle in Square
题目传送门题意:给定一个圆的半径,求这个圆的外切正方形的面积与这个圆的面积差。思路:面积差为4*r*r-PI*r*r。#include <bits/stdc++.h>using namespace std;const double PI = 2*acos(0.0);int main(void){ int T, cas=1; scanf("%d", &T); while (原创 2017-10-21 10:29:12 · 268 阅读 · 0 评论 -
LightOJ-1020-A Childhood Game
题目传送门题意:有n个石头,一次一个人只能拿一块或者两块,如果Alice先开始拿,那么拿最后一块石头的人输,如果Bob先开始拿,那么拿最后一块石头的人赢。给出石头的个数和谁先开始拿,问谁能赢。思路:如果Bob先拿,则只要石头数是3的倍数就是Alice赢;如果Alice先拿,则只要是石头数-1是3的倍数就是Bob赢。#include <bits/stdc++.h>using namespace std原创 2017-10-21 10:26:14 · 306 阅读 · 0 评论 -
LightOJ-1019-Brush (V)
题目传送门题意:有N个路口和M条路,求从1路口到N路口的最短路径。思路:裸的最短路模板。#include <bits/stdc++.h>using namespace std;int mp[120][120];int n, m;const int inf = 0x3f3f3f3f;void init(){ for (int i = 0; i <120; i++) {原创 2017-10-21 10:18:45 · 291 阅读 · 0 评论 -
LightOJ-1017-Brush (III)
题目传送门题意:一个二维平面上有N个灰尘,有一个宽度为w的刷子,一次可以刷一个w宽度的横线范围内的所有灰尘,只能刷k次,求刷的灰尘最多有多少。思路:动态规划,dp[i][j]表示前i个灰尘刷j次最多可以刷掉的灰尘数。状态转移方程为dp[i][j] = max(dp[i][j], dp[p-1][j-1]+sum)#include <bits/stdc++.h>using namespace std;原创 2017-10-21 10:15:53 · 245 阅读 · 0 评论 -
LightOJ-1016-Brush (II)
题目传送门题意:有一个宽为w的刷子,刷子只能沿着x轴刷,有n个灰尘的坐标,问至少多少次才能刷完所有的灰尘。思路:排序之后直接枚举。#include <bits/stdc++.h>using namespace std;int y[50000+1000];int n, w;bool cmp(int a, int b){ return a<b;}int main(void){原创 2017-09-06 21:37:25 · 306 阅读 · 0 评论 -
LightOJ-1015-Brush (I)
题目传送门题意:求输入的灰尘的总体积,负数不考虑。思路:求和。#include <bits/stdc++.h>using namespace std;int main(void){ int T, cas = 1; scanf("%d", &T); while (T--) { int sum=0, n,x; scanf("%d", &n原创 2017-09-06 21:34:36 · 343 阅读 · 0 评论 -
LightOJ-1014-Ifter Party
题目传送门题意:给定两个数p,l,求所有x,使p%x==l。思路:注意l>x。#include <bits/stdc++.h>using namespace std;int ans[10100];int main(void){ int T, cas=1; scanf("%d", &T); while (T--) { int p, l, num =原创 2017-09-06 21:32:25 · 278 阅读 · 0 评论 -
LightOJ-1013-Love Calculator [LCS][DP]
题目传送门题意:给定两个字符串,求构造一个字符串包含这两个字符串,求最短的构造字符串和不同构造字符串的数量。思路:dp[x][y]数组表示从a[1]~a[x],b[1]~b[y]所能构造的最短字符串的长度,ans[x][y]表示a[1]~a[x],b[1]~b[y]所能构造的字符串的数量。#include <bits/stdc++.h>using namespace std;int main(voi原创 2017-09-06 21:29:03 · 314 阅读 · 0 评论 -
LightOJ-1012-Guilty Prince [DFS]
题目传送门题意:给定一个迷宫,求与’@’相连的面积一共有多大。思路:红黑砖问题,直接从’@’处DFS并记录个数。#include <bits/stdc++.h>using namespace std;char mp[30][30];int cnt, n, m;int next[4][2] = {1,0,-1,0,0,1,0,-1};void dfs(int x, int y){ cn原创 2017-08-28 16:03:36 · 353 阅读 · 0 评论 -
LightOJ-1011-Marriage Ceremonies [状态压缩][DP]
题目传送门题意:给n对男女两两之间的好感度,求将他们所有两两结合起来得到的最大好感度。思路:状压DP,dp[i][j]表示选前i个人的j种选法的最大好感度。#include <bits/stdc++.h>using namespace std;int dp[20][70000];int a[20][20];int main(void){ int T, cas=1; scanf(原创 2017-08-28 15:59:52 · 319 阅读 · 0 评论 -
LightOJ-1010-Knights in Chessboard [规律]
题目传送门题意:象棋中马是走日字形,问在m*n的棋盘中最多可以放多少个马,使他们不能互相攻击。思路:规律题。 - 如果只有一行或者一列,则所有的棋盘均可以放马。 - 如果有两行或者两列,则一个田字型可以放2*2个马,然后空出一个田字型。 - 其他情况则可以放总面积的一半。#include <bits/stdc++.h>using namespace std;int main(void){原创 2017-08-28 15:56:42 · 400 阅读 · 0 评论 -
LightOJ-1008-Fibsieve`s Fantabulous Birthday [规律]
题目传送门题意:给定一个图表,求第n个数的坐标。思路:规律题,1 * 1的方阵最外层为1,2 * 2的方阵最外层为[2,4], 3 * 3的方阵最外层为[5,9],可知n*n的方阵最外层为[(n-1)^2+1,n^2]。可求出第N个数所在的最大方阵的行数和列数,根据行数的奇偶判断是先行后列还是先列后行增加,然后根据N与对角线的比较得到行号列号,#include <bits/stdc++.h>usin原创 2017-08-28 15:46:06 · 317 阅读 · 0 评论 -
POJ-2253-Frogger [最短路][Dijkstra]
题目传送门题意:输入一些石头的坐标,求从1号石头到2号石头的青蛙距离。(青蛙距离:最短路径上的最长跳跃距离)思路:Dijkstra算法的变形,每次更新dis数组时用dis[j] = max(dis[f], mp[f][j])来求青蛙距离。#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#in原创 2017-08-21 09:08:56 · 267 阅读 · 0 评论 -
POJ-1258-Agri-Net [最小生成树]
题目传送门题意:输入一个邻接矩阵,求最小生成树。思路:裸的prim模板题。#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <queue>#include <map>#include <set>usin原创 2017-08-21 08:49:56 · 300 阅读 · 0 评论 -
POJ-1751-Highways [最小生成树]
题目传送门题意: 给定N个城市的坐标,已经建立了M条高速公路,问还需要建立多少条高速公路,才能使所有城市联通,要求建立的高速公路距离总和最短,输出所有新建立的高速公路 思路: 先将已经建立的边合并,用Kruskal求最小生成树,并输出合并的边。#include <algorithm>#include <iostream>#include <cstdlib>#include <cstrin原创 2017-07-27 10:39:12 · 271 阅读 · 0 评论