
ACM算法竞赛
虽然是弱鸡,但是还是想把自己刷过的题呈现出来,希望可以帮助那些正在ACM之路上的同学.
FlushHip
凝视深渊
展开
-
POJ3190
Problem: Stall Reservations Description: 奶牛挤奶用机器的问题,一台机器同一时间只能为一头奶牛挤奶,问你最少需要多少台机器,然后再输出每头奶牛用了哪一台机器。 Solution: 贪心+排序+优先队列,我们开一个优先队列,意思就是队列中的奶牛正在使用机器挤奶。我们比较队头元素和我们排好序的奶牛开始时间,如果排好序的奶牛开始时间早于队头元素结束时间,那么我们原创 2016-03-21 21:23:35 · 809 阅读 · 0 评论 -
POJ2449
Problem: Remmarguts’ Date Description: 给你一个图,让你寻找第K短的路径从src点到des点。 Solution: A* +邻接表的迪杰斯特拉。这题目是ACM/ICPC上的一道例题。我用来加深了对A* 算法的理解和对邻接表的迪杰斯特拉的学习。我们先用迪杰斯特拉算法求出每一个点到des的距离用来当做评估条件,然后用A* 算法从src向下广搜。由于A* 算法有这原创 2016-03-22 23:37:00 · 624 阅读 · 0 评论 -
POJ3737
Problem: UmBasketella Description: 给出一个圆锥体的表面积(底面积+侧面积)。让你求出这个圆锥的最大体积和此时的高与半径。 Solution: 根据题目意思,我们可以得出有两个变量还有一个条件,那么我们可以利用这个条件来减少一个变量,最后再利用函数的性质来求得最大值。S=PI* r* sqrt(h* h+r* r)+PI* r* r ; V=PI* r* r原创 2016-03-23 15:53:12 · 941 阅读 · 0 评论 -
HDU1106
Problem: 排序 Description: 输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。 你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。 Solution: 我们利用string.h中的strtok函数。这个原创 2016-03-23 17:30:28 · 558 阅读 · 0 评论 -
POJ1106
Problem: Transmitters Description: 给你一个半圆的圆心坐标和半径,再给你平面上的一些点,然后半圆绕圆心转动,问这个半圆最多可以覆盖多少个点。 Solution: 我们先预处理下,把到圆心距离大于半径的点去掉,然后枚举每个点,利用向量的叉积来判断剩余点是否在这个点与圆心所在直线的一边。最后维护一个最大值就可以了。 Code(C++): #include <std原创 2016-03-24 17:08:01 · 866 阅读 · 0 评论 -
POJ1679
Problem: The Unique MST Description: 问最小生成树是否唯一。如果唯一求出最小生成树的值。 Solution: Kruskal或者Prim. 如果用Kruskal算法的话,我们在并查集枚举边枚举到当前边的时候我们向后比较是否存在同当前边距离相同同时父节点也相同的边,如果有,那么最小生成树连边的话就有两种选择,这个时候就不是唯一的了;如果用Prim算法,那么我们原创 2016-03-25 21:33:00 · 481 阅读 · 0 评论 -
POJ1700
Problem: Crossing River Description: N个人过河,只有一条船。船到了对岸得有人把船划回来。一条船最多坐两个人,过河的时间以慢的为准,问最少需要多少时间才能把所有的人都送到对岸。 Solution: 贪心,首先想到的贪心是,时间多的人要带时间次多的人过河,这个很简单想,于是我们要先对时间进行排序。然后就是痛苦的开始了。我开始想着划船肯定要用时间最少的人来划船,于原创 2016-03-29 14:39:43 · 874 阅读 · 0 评论 -
POJ2709
Problem: Painter Description: 买颜料,有n种需要的颜料,现在要买规格为50ml一瓶的一套颜料,一套颜料中有你所有需要的颜料。但是没有灰色的颜料,灰色的颜料需要任意三种颜料去搭配,但是搭配后体积不会变,也就是说,每种选用aml,出来的灰色还是aml,现在问你最少需要买多少套颜料。 Solution: 贪心。我们可以得到一个要买颜料的最大值,然后用进一法买这么多瓶颜料,原创 2016-03-29 15:41:05 · 689 阅读 · 0 评论 -
POJ1281
Problem: MANAGER Description: 进程队列管理。a-加入进程值为x的进程;p-修改移除时的标志,1表示移除最小值,2表示移除最大值,默认为1;r表示移除最大值或者最小值。然后给你一个移除数组,数组的意思表示要你输出第array[i]次移除的值。 Solution: 模拟,我们用数组来模拟,定义head, tail。这个表示队列中有用的数据。每次加入往数组中加入数字就进行原创 2016-03-29 17:52:51 · 645 阅读 · 0 评论 -
POJ1546
Problem: Basically Speaking Description: 16进制以内的转换。 Solution: JAVA中的Integer和String中提供了很多方便的方法,于是偷懒用了JAVA做了。 Code(JAVA): import java.util.Scanner;public class Main{ private Scanner cin=new Scanner原创 2016-03-29 18:46:24 · 520 阅读 · 0 评论 -
POJ3301
Problem: Texas Trip Description: 给你一些点的集合,让你用一个最小的正方形来覆盖所有的点,求这个正方形的面积。 Solution: 三分求极值+图形旋转。我们知道,求最小正方形也就是求最小边长,如果这个正方形是平行于X轴的,那么最小边长就是任意两个点横向和纵向的最大值。那么我们要绕原点旋转这些点,这个其实也可以看成是正方形绕这些点旋转。那么我们对于旋转了rad度的原创 2016-04-01 17:17:42 · 550 阅读 · 0 评论 -
SGU195
Problem: New Year Bonus Grant Description: 微软公司发奖金,规则是这样的。BOSS编号为1,每个员工可以自己拿奖金,也可以把奖金全部给一个下属。也就是说,如果你拿了奖金,那么与你同一个老板的员工和你的下属都不能拿奖金,现在求微软公司最多要付多少奖金。 Solution: 初看这个题是用树形DP,但是其实可以贪心,我们考虑选着中间的员工。如果给他发奖金,那原创 2016-04-01 21:53:21 · 576 阅读 · 0 评论 -
SGU171
Problem: Sarov zones Description: N个地区,每个地区有一个Q值,且每个地区只能容纳H个人,现在有SUM个人,每个人有一个权值W和一个U值,只有当U值大于或等于某个地区的Q值时,这个人的W值才能显示,现在问你如何安排这SUM个人的去向使得能显示的W值的和最大! Solution: 贪心。我们知道,权值最大的一个人肯定要优先考虑,并且要把他安排到Q值小于它但是又是最原创 2016-04-08 12:54:43 · 500 阅读 · 0 评论 -
HDU4717
Problem: The Moving Points Description: 平面坐标系中有n个点,这些点都会按照一定的速度(矢量)移动。让你求这些点任意两点间距离最大值在某一时刻的最小值。 Solution: 三分。一开始我是读错题目了,我以为是求任意两点间距离的最小值。我们写出两点距离公式就会知道,这是一个关于时间T的二次函数。那么就是一个凹函数。这个时候三分是最合适的解法了。 Code原创 2016-04-08 13:01:17 · 453 阅读 · 0 评论 -
HDU2585
Problem: Hotel Description: 一个人住酒店。但是他忘记门牌号码了,现在给出一个他模糊记得的门牌号字符串,这个字符串包含‘* ’,‘?’,‘a-z’。‘* ’表示零个或多个字符,而‘?’表示一个任意的字母。现在给出多个候选项,让你找出有几个符合这个人的门牌号的。 Solution: 递归。我们抓住‘* ’这个字符。这个字符可以让我们得出一个比原问题更小的解结构。比如我们比原创 2016-04-15 23:46:26 · 662 阅读 · 0 评论 -
HDU1195
Problem: Open the Lock Description: 开一把四位数的密码锁。你可以把任意一个数字加一或减一。如果变成0就是9,如果是10就是1,你也可以交换相邻的两个数字。问需要最少的步数把一把锁解开。 Code(C++): #include <stdio.h>#include <string.h>#include <stdlib.h>#include <queue>usi原创 2016-04-16 00:49:33 · 848 阅读 · 0 评论 -
HDU4260
Problem: The End of The World Description: 汉诺塔问题变形。给你一串字符串,第一个字符代表着第一小的那个盘子所在的柱子,以此类推。问你最少要多少步才能把所有的盘子移到B柱子。 Solution: 递归。这个递归我一开始也不是很明白,后来仔细想想确实是这样。递归的过程其实如同解决普通的汉诺塔问题是一样的。都是把前N个盘子移动到某根柱子。这个时候你可能会有疑原创 2016-04-18 20:59:10 · 693 阅读 · 0 评论 -
POJ1066
Problem: Treasure Hunt Description: 一个正方形区域,里面有很多墙,这些墙的端点都在正方形的边上。现在这个正方形的区域内有一个宝藏。问你从正方形外至少要开多少扇门才能到达宝藏的位置。 Solution: 线段相交,为什么呢,注意这句话,“这些墙的端点都在正方形的边上”,这就意味着墙会把正方形分成很多个封闭的小区域。以至于你必须跨过墙,而不能绕过墙。所以我们直接枚原创 2016-04-19 23:13:12 · 490 阅读 · 0 评论 -
POJ2155
Problem: Matrix Description: 给你一个矩阵,矩阵中的元素初始化为零。现在对某一区域进行置反操作,然后输出某一个点是零还是一。 Solution: 二维树状数组。这个要用到一个小技巧,我们看看一维的情况,对区间[x,y]中的数进行置反操作,我们可以把点x的值加1,点y的值加1。这样我们要求某一个点的具体值可以对[1,X]这个区间进行求和然后模2。为什么可以这样呢,你可以原创 2016-04-24 20:34:35 · 560 阅读 · 0 评论 -
POJ2186
Problem: Popular CowsDescription: 有N头牛,M对关系,表示A欢迎B,欢迎关系具有传递性。现在让你求所有头牛都欢迎的牛的头数。Solution: 如果所有牛的关系形成一个环,那么这个圈中的所有的牛都是满足条件的,这个条件就对应了强连通分量的概念,一个强连通分图中的牛肯定都是满足条件的;还有一种情况也是满足条件的,就是所有的关系形成一棵树,且所有点都能通到root,这棵树的root就原创 2016-05-10 17:00:22 · 933 阅读 · 0 评论 -
POJ1236
Problem: Network of Schools Description: 有N个学校,每个学校之间单向可以发送软件,现在给你一些学校之间的收发关系。问你下面两个问题:至少要给多少个学校发送软件才能使得最终所有学校都收到软件;至少要多加多少个关系才能使得向任意一个学校发送一套软件,每个学校都能收到软件。 Solution: 先看第一个问题,这里求的是一个起始点的个数问题。那么我们知道,原创 2016-05-12 08:41:27 · 970 阅读 · 0 评论 -
POJ1135
Problem: Domino Effect Description: 多尼诺骨牌游戏,给你一些关键骨牌,推到了这些关键骨牌可带动关键骨牌之间的骨牌推倒。关键骨牌之间是可以通过推倒来到达的,现在给你一些关键骨牌间的到达时间,问你最后一块倒下的骨牌的倒下时间是多少,在哪个位置。 Solution: 最短路径+枚举端点与端点直接相连的边。多米诺骨牌符合最短路径,这是用最短路径的原因;枚举,我们通过最原创 2016-05-12 14:58:21 · 783 阅读 · 0 评论 -
POJ2031
Problem: Building a Space Station Description: 给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通。如果两个球有重叠的部分则算为已连通,无需再搭桥。求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离),其实我也是百度的题意。 Solution: Prim算法,这里要注意的是有球是直接连通的。那么我们在处理这个map[f原创 2016-05-15 14:55:35 · 573 阅读 · 0 评论 -
HDU5687
Problem: 2016”百度之星” - 资格赛(Astar Round1)- C Description: 中文题 Solution: 字典树的操作,不过这个题有些不同的是它对单词的前缀进行操作。所以我们添加一个num来表示以该结点以前的字母为前缀的单词有多少个。那么我们的三个操作就很好写了,但是要注意的是,在写删除操作的时候,我们要记录下最后一个节点的num,然后重新从root遍历下来,沿原创 2016-05-17 17:03:01 · 857 阅读 · 0 评论 -
hiho一下 第九十八周
Problem: 搜索一·24点 Description: 经典的24点游戏 Solution: 枚举搜索,运算符共有44种,四个数字的排列方式有4!4!种。枚举排列,同时通过DFS枚举三个位置上的运算符情况,最后枚举括号的情况,括号的情况有55种。通过这样的暴力枚举,一旦我们找到了24点的情况我们就停止枚举。 Code(C++): #include <stdio.h>#include <s原创 2016-05-17 19:24:32 · 475 阅读 · 0 评论 -
HDU5685
Problem: 2016”百度之星” - 资格赛(Astar Round1)- A Description: 中文题 Solution: 看到这个题第一感觉就是DP,dp[i]表示从1到i的哈希值的积MOD9973。那么我们要求a到b的哈希值=dp[b]/dp[a-1]%9973,这个式子如果dp[i]不取模的话就是正确的,但是它就是取模了,那么我们怎么办,这个时候当然是把除法转化成乘法,乘法原创 2016-05-17 20:17:54 · 799 阅读 · 0 评论 -
HDU5547
Problem: Sudoku Source: The 2015 China Collegiate Programming Contest Description: 解一个4*4的数独。 Solution: 暴力搜索就好,注意这道题的Hash判重的方法。 Code(C++): #include <stdio.h>#include <string.h>const int M=4+2;co原创 2016-05-18 15:01:36 · 642 阅读 · 0 评论 -
HDU5551
Problem: Huatuo’s Medicine Source: The 2015 China Collegiate Programming Contest Description: 一个人有N种瓶子,他要用这些瓶子形成一个链条,链条上的瓶子种类要形成回文。问最少要多少个瓶子才能构成这样的链条。 Solution: 通过分析我们可以得知,瓶子的个数为奇数是最少的,从左边到终点放N−1N-1原创 2016-05-18 15:24:03 · 571 阅读 · 0 评论 -
HDU5543
Problem: Pick The Sticks Source: The 2015 China Collegiate Programming Contest Description: 一个人用长度为L的容器装金条,每条金条有自己的长度和自己的价值。装金条的时候只要金条的重心在容器中那么就可以装,现在问你这个人最多能装走多少价值的黄金。 Solution: 如果没有题目描述中加粗的条件,那么这个原创 2016-05-19 16:51:10 · 1172 阅读 · 0 评论 -
HDU5546
Problem: Ancient Go Source: The 2015 China Collegiate Programming Contest Description: 两个人下围棋,现在问你黑棋方下一步能不能吃掉至少一个白棋。 Solution: 我们先用DFS求出每个连通块。然后只需关注每个连通块外是否有少于或等于1个的空白位置。如果有,那么黑棋下一步直接就把自己的棋子放到该位置就能吃原创 2016-05-19 17:54:55 · 524 阅读 · 0 评论 -
UVa11292
Problem: Dragon of Loowater Description: 一个王国中有NN个骑士,有MM条恶龙。每个骑士都有一个属性XX,代表着这个骑士可以砍掉一头直径不大于XX的头的恶龙,并且花费XX金币。现在问你这些骑士能不能把所有恶龙的头都砍掉,如果能,那么最低要花费多少钱雇佣他们。 Solution: 看到这个题我们肯定会有一个直觉。那就是让骑士去砍他能砍的头最大的恶龙。恶龙肯定原创 2016-05-23 17:11:15 · 453 阅读 · 0 评论 -
hiho一下 第九十九周
Problem: 搜索二·骑士问题 Description: 国际象棋棋盘中有三个马,问这三个马最少走几步能走到同一个格子。一次只能走一个棋子。 Solution: 基础的广搜题目,用一个6维数组保存当前状态。 Code(C++): #include <stdio.h>#include <string.h>typedef struct tagPoint{ int x,y; t原创 2016-05-24 14:01:30 · 552 阅读 · 0 评论 -
UVa10881
Problem: Piotr's AntsDescription: 一群蚂蚁在一条长为L的木棍上爬行。他们的速度是1,现在给定这群蚂蚁的位置和他们爬行的方向,当两个蚂蚁相遇时他们会立即改变他们的方向,当一个蚂蚁爬到木棍的端点时就会掉下去。现在问你在T时刻这群蚂蚁的位置和方向。原创 2016-05-24 17:45:02 · 525 阅读 · 0 评论 -
LA3708
Problem: Graveyard Description: 有NN个墓地,均匀排布到一个周长为10000的圆周上。现在要加MM个墓地到这个圆周上,并且均匀分布,那么问你,这NN个圆周至少要移动多少距离才能满足均匀分布这个条件。 Solution: 这个问题我看到的第一感觉就是枚举。我们要计算出N+MN+M个墓地在圆周上均匀分布的位置POS[i]POS[i]。然后依次枚举NN个墓地在圆周上均匀原创 2016-05-24 18:34:00 · 931 阅读 · 2 评论 -
LA2995
Problem: Image Is Everything Description: 有一个正方体。现在拍到了它66个面的正视图。这个正方体有事由一个个的1∗1∗11*1*1的小正方体组成的,每个小正方体的66个面都涂了相同的一种颜色。输入中的点代表着该位置看不到小正方体了。现在给你一个N∗N∗NN*N*N的大正方体,问你这个大正方体最多可能由多少小正方体组成。 Solution: 第一步我原创 2016-05-27 14:03:32 · 579 阅读 · 0 评论 -
UVa11464
Problem: Even Parity Description: 给你一个0101矩阵。现在定义每个格子的奇偶性:如果一个格子的上下左右格子中的数字相加为奇数,那么这个格子就是奇的,反之亦然。现在问你,只要要把多少个数字为0的格子转化为数字为1的格子,才能使得所有的格子都是偶的。 Solution: 首先我们可以想到用枚举的办法搞。但是如果去枚举每个数字为0的格子,那么最多要枚举215∗15原创 2016-05-27 13:50:53 · 468 阅读 · 0 评论 -
POJ3463
Problem: Sightseeing Description: 给你一个有向图。现在问你最短路的条数和比最短路长度大一的路径条数一共是多少。 Solution: 通过这个题目,熟悉了求解最短路和次短路的长度和条数的方法,真正理解了迪杰斯特拉。我们在用迪杰斯特拉更新disdis的时候要判断小于最短路、等于最短路、小于次短路、等于次短路的情况。仔细画个图就理解了。看代码吧。 Code(C++)原创 2016-05-29 16:04:30 · 821 阅读 · 0 评论 -
LA3401
Problem: Colored Cubes Description: 给你一下涂了色的正方体。现在问你能不能通过重涂某些正方体的某些面使得所有的正方体涂色都是一样的。 Solution: 看到这个题目,可以肯定这是一个模拟题。我们要怎么模拟呢,题目中会给出每个正方体在标准摆放方位的颜色,但是正方体是可以旋转的,也就是每转动一个方位,对应的颜色排列就是不一样的。于是我们可以通过计算得出一个正方体原创 2016-05-30 22:25:54 · 1200 阅读 · 0 评论 -
POJ1603
Problem: Risk Description: 给你一个无向图,然后问你从某些srcsrc到desdes最少要进过多少个点。 Solution: FloydFloyd算法,如果两个点时连接的,就把他们之间的路劲长度设为11。跑一下floydfloyd算法就好了。 Code(C++): #include <stdio.h>#include <string.h>#define MIN(a,原创 2016-05-31 16:29:42 · 492 阅读 · 0 评论 -
UVa10795
Problem: A Different Task Description: 给出汉诺塔的一种形态,问你至少要通过多少次的移动才能到达给定的另一种形态。 Solution: 这个题目和HDU4260很相似,只不过需要到达的那种形态是种标准形态(也就是所有的盘子都在同一根柱子上)。其实我们要发散自己的思维,既然很相像。那么我们为什么不假设这两种状态都是又标准形态变过去的呢。这种假设是完全合理的,由原创 2016-06-02 16:55:55 · 566 阅读 · 0 评论