随笔分类 -  POJ

摘要:题意: 给出n个工厂的产品参数带宽b和价格p,在这n个工厂里分别选1件产品共n件,使B/P最小,其中B表示n件产品中最小的b值,P表示n件产品p值的和。 输入 iCase n 表示iCase个样例n个工厂 m1 p1 b1 p2 b2..pm1 bm1 //第一个工厂有m1个同种类不同参数的产品,每一个产品的参数分别是p1 b1 p2 b2 m2 p1 b1 p2 b2..pm2 bm2 ... mn p1 b1 p2 b2..pmn bmn 思路: 排序,先把b从小到大排序,然后把p从小到大排序,最后让第几个工厂的序号从小到大排序 排完后就可以直接... 阅读全文
posted @ 2013-08-11 14:05 Griselda. 阅读(417) 评论(0) 推荐(0)
摘要:题意: 给出4*4的棋盘,只有黑棋和白棋,问你最少几步可以使棋子的颜色一样。 游戏规则是:如果翻动一个棋子,则该棋子上下左右的棋子也会翻一面,棋子正反面颜色相反。思路: 都是暴搜枚举。 第一种方法:暴力dfs枚举 棋子只有最多翻一次,因为翻两次后结果和不翻是一样的,所以整个棋盘最多翻16次。 用step代表翻转的次数,当翻转了step次时,就看一下整个棋盘是否是清一色的。 当棋盘是清一色的时候就直接输出step,得到的就是最少翻转次数使棋盘清一色。 第二种方法:利用位运算来优化 因为棋子不是白就是黑,所以可以用0和1来表示。 然后为每一个棋子... 阅读全文
posted @ 2013-07-16 10:57 Griselda. 阅读(1035) 评论(0) 推荐(0)
摘要:题意: 给出n个字母 问是否可以全部头尾相接,输出按字典序排列思路: 用套圈法求出欧拉回路 先把单词读入 排序保证最后结果是按字典序的 用并查集看是否连通 根据入度和出度看是否是欧拉路径,如果有必要也要找出起点 用套圈法求出欧拉路径 输出结果 Tips: ※不能用cin cout ※注意不能直接由 ansi == n 来判断是否有欧拉路径.. 而要由出度和入度的关系来判断.. 因为如果出现是出度-入度 = 1 且 入度-出度 = 1的时候要保证 出度-入度 = 1的点是起点~ 否则即使连通也不能证明存在欧拉路径.. ※用并查集检查是否连通... 阅读全文
posted @ 2013-02-01 13:16 Griselda. 阅读(282) 评论(0) 推荐(0)
摘要:题意: 给出一些集合和原来的集合进行多种运算,输出运算后的结果.. 输入: T a b 表示是原集合与该集合进行T操作~ 一开始集合为空.. 最后输出结果~如果是空集合就输出empty set思路: 这道题巧妙的地方是根据集合操作的特点把运算改成了成段的数据更新.. 线段树延迟标记延迟了更新的结果.. 根据集合操作的特点.. 可以看出: U:把区间[l,r]覆盖成1 I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0 C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换 S:[l,r]区间0/1互换 其中如果... 阅读全文
posted @ 2012-10-28 20:46 Griselda. 阅读(217) 评论(0) 推荐(0)
摘要:题意: 给出了n份海报的贴在board上的起始位置和结束位置 问最后可以看到多少份海报 输入: n表示有n份海报 接下来n行 每行 a b 表示海报占据了a~b的位置..思路: 线段树成段更新 用树的结点value表示控制范围内的海报编号.. 因为不用更新到底+查询到每一个叶子节点..所以提高了查询和更新效率.. 其中因为海报长度给的很大.. 所以可以使用离散化来减少空间的消耗以及查询和更新时的递归次数..Tips: 因为给出的a b 表示的是在a~b内贴了海报.. 所以a b给的是值..但是表示的是一段范围.. 如果用正常的离散化..就可能出现 最底下一层贴了一张海... 阅读全文
posted @ 2012-10-26 07:42 Griselda. 阅读(310) 评论(0) 推荐(0)
摘要:题意: 给出一些值 然后给出你一些命令 按照命令输出 命令: C a b c 表示更新a ~ b的值加上 c Q a b 表示查询a~b的和输入: n m 表示有n个数 m 个操作 接下来 m 行为命令行思路: 就是简单的线段树成段更新求和 Tips: ※ 询问的时候要 pushdown ※ 注意范围问题吖~Code: View Code 1 #include <stdio.h> 2 #include <cstring> 3 using namespace std; 4 #define LL long long 5 6 const int MAXN = 100010;. 阅读全文
posted @ 2012-10-17 21:37 Griselda. 阅读(322) 评论(0) 推荐(0)
摘要:题意: 一群小孩顺时针坐然后在玩约瑟夫环的游戏.. 从第k个小孩开始..每个被选中的孩子扔出手中的纸牌.. 然后按着纸牌上面的数找下一个被选中的小孩.. 如果牌中的数是正数就顺时针数.. 如果是负数就逆时针数.. 其中第 i 个被选中的小孩会得到f( i )颗糖.. f( i )表示 i 的正因子个数.. 要求是找出得到糖最多的孩子个数.. 输入: n k 表示有n个小孩..从第k个开始 接下来 n 行有n个小孩的名字和他手上的牌的编号..思路: 一开始想的是暴力找出这个小孩.. 但是会很麻烦.. 然后这里就用到了反素数了.. 反素数:<http://ac... 阅读全文
posted @ 2012-10-16 12:48 Griselda. 阅读(385) 评论(0) 推荐(0)
摘要:题意: 给出一些人要求插入队列的位置和他们的身高 输出最后队列的每个人身高输入: 给出n 表示有n个人 给出每个人要插进的队列的位置和该人的身高思路: sum 数组保存该区间的空位 a 数组保存该位置的人的身高 pushup函数用来自下向上更新区间空位 modify函数用来根据sum值找出空位并插入..Tips: 比较的时候..如果比左节点的sum值大就往右子树插位置.. 所以比较函数写的应该是..if(p <= sum[rt<<1]) 往右子树插的时候传入的参数也应该相应减少..即p - sum[rt<<1]Code:View Code 1 //模拟链表 数据量 阅读全文
posted @ 2012-10-11 20:49 Griselda. 阅读(274) 评论(0) 推荐(0)
摘要:题意: 给出n个数..问循环排序后的最小逆序数思路: 根据出现次序..用线段树的sum记录某一区间出现次数.. 把出现的数值a[i] 更新到 sum[a[i]].. 根据题意..当每一次更新的之前..都对当前位置到最后位置出现的数进行查询.. 即可得到出现比该值早而又比该值大的数的个数..即满足逆序数对的定义.. 所以求和就可得到逆序数对的值.. 当每一次把队头的值移到队尾.. 逆序数对就减少了当前值(a[i]-1)<逆序数对包含该值的都没有了..>.. 但是还有一些逆序数对增加了..(加入到队尾时可与该数组成逆序数对的..)即n-a[i]对.. 所以每一次循环后存在的逆序数... 阅读全文
posted @ 2012-10-10 22:02 Griselda. 阅读(571) 评论(0) 推荐(0)
摘要:题意: 有一个牧师要给好几对新婚夫妇准备婚礼.. 已知每对新婚夫妇的有空的时间以及婚礼持续时间.. 问是否可以让每对新婚夫妇都得到该牧师的祝福~ 如果可以就输出YES以及可行解 不可以就输出NO输入: 一个n 表示有n对新婚夫妇 接下来n行每行a b c 表示在a~b这段时间有空..以及婚礼会持续 c.. P.S.时间只可以选在a开始或者b结束.. eg:08:00 09:00 30 可以在8:00~8:30举行婚礼或者8:30~9:00举行婚礼思路: 2-sat 以在前一段时间举行婚礼或者后一段时间举行婚礼为2个可选方案 然后每对新婚夫妇婚礼时间冲突了就给和另外一个方案连... 阅读全文
posted @ 2012-10-09 13:40 Griselda. 阅读(533) 评论(0) 推荐(0)
摘要:题意: panda和ikki.玩游戏.. 给出m个点对关系..这些点都在圆上.. 给点对连线..如果可以不交叉(可以在圆内或圆外连线)则panda赢..否则ikki.赢 输入: 给出n m 表示有n个点 m个点对 接下来m行 有a b 表示点a 和 点b 之间有一条线思路: 2-sat..用来解决2个集合的冲突问题.. 这道题..冲突在于是在圆内和在圆外.. 把边看成点.. 然后看所有边连起来之后会不会出现冲突..即在圆外的边和在圆内的边同时出现在一个强连通分量里了.. 所以求出强连通分量.. 看交叉的两条边..用tarjan染色.. 如果冲突出现了(在圆... 阅读全文
posted @ 2012-10-05 19:26 Griselda. 阅读(255) 评论(0) 推荐(0)
摘要:题意: 某个公园要修路..这将导致两个景点无法连通 输入: 给出n m 表示有n个景点 m条路 接下来m行每行有a b 表示a景点和b景点相连.. 问加几条边可以使任意两个景点都相连..思路: 先用tarjan算法求出每个连通分量 然后对无向图来说..变成双连通分量的方法就是(入度为1的点+1)/ 2Tips: 无视POJ的simple输入输出 都是坑人的..T0T 还有就是现在这样tarjan算法第一次调用的时候就是tarjan(1, 1)Code: View Code 1 #include <stdio.h> 2 #include <cstring> 3 #incl 阅读全文
posted @ 2012-10-05 12:09 Griselda. 阅读(191) 评论(0) 推荐(0)
摘要:题意: 很久很久以前.. 有一个国王.. 他有好几个儿子.. 这些王子都喜欢上了邻国的公主.. 他们准备迎娶自己喜欢的公主中的一个.. 国王就让宰相给列一个清单.. 宰相就给了国王一个清单..上面写明了哪个王子将迎娶哪个邻国的公主.. 但是调皮的国王不太满意~~ 他还想知道他的儿子分别可以迎娶哪几个公主中的一个而不会让他的兄弟因此而吃醋.. 所以宰相又得重新写清单了.. 噢..对了~邻国的公主和王子人数一样多~<这是一个奇怪的国家..> 输入: 一个n表示有n个王子.. 接下来n行每行有一个m表示第i个王子喜欢m个公主.. 然后给出m个公主的序号.. 最后一... 阅读全文
posted @ 2012-10-05 07:54 Griselda. 阅读(186) 评论(0) 推荐(1)
摘要:题意: 给出n个学校的兄弟学校..<单方面认为> 如果给了一个软件给某个学校..他就会把这个软件给他的兄弟学校.. 然后求两个解: 1st: 至少准备多少个软件..可以使所有的学校都有这个软件.. 2nd:至少加多少条边..可以使只给一个软件..就能让所有学校都得到这个软件..输入: 一个n 代表有n个学校.. 接下来n行.. 第i行 给出第i个学校的兄弟学校(单方面认为)的列表..以0结束.. 输出两个解的结果..思路:缩点之后把原图变成一个有向无环图.. 两个解可以看成是: 1st:把该有向无环图看成一个森林..求的就是有多少棵树..<即入度为0的根节点的个数... 阅读全文
posted @ 2012-10-04 21:09 Griselda. 阅读(197) 评论(0) 推荐(0)
摘要:题意: 给出一些房间之间的关系 问任意两个房间是否存在一条互通的路径..即单相连通.. 输入: 给出T表示有T组数据 每组数据给出n m 表示n个房间 m个关系 接下来m行..每行给出a b 表示a房间 和 b房间之间是连通的.. 如果任意两个房间之间存在单相连通..则输出yes 否则 no思路: 先用tarjan算法求出每个强连通分量..然后对每一个进行染色.. 然后建图..拓扑排序.. 如果排序不唯一..就是有超过两个点是有0个初度的.. 这代表其中有两个房间是不相连的..Tips: 点太多或者边太多的情况下.. 就要用前向星建图了..Code:View Code... 阅读全文
posted @ 2012-10-03 21:33 Griselda. 阅读(193) 评论(0) 推荐(0)
摘要:题意:给出一个每一格带值的矩阵每一次只可以从左上角走到右下角问走过k次后最多能得到多少值P.S 走过的格子值会变成0输入: 给出一个n 和 k 给出n*n 矩阵思路: 因为求的是最大值 所以应该求最长距离..把最小路径改成求最大路径 <相应改变的就是松弛操作 和 dis的初始状态> 为了保证每个点只取一次值 并且 可以经过多次 就进行拆点 然后对应点之间加两条边 ①. 容量为1 费用为该点的值 ②. 容量为INF 费用为0 ①边保证了该点走过后变为0值 ②边保证该点可以经过多次 还有超级源点跟每个点之间连边 容量为k 费用为0 超级汇点和每个拆点之间连边 容量为k 费用... 阅读全文
posted @ 2012-10-02 20:54 Griselda. 阅读(238) 评论(0) 推荐(0)
摘要:题意:给出m个路径的起点和终点还有长度找出一条路径可以从1到n然后回到1..并保证找到的路径是不重复而且是最短的..思路:容量控制经过只有1次费用控制长度在建完图后求最小费用最大流..就可以找出最短距离..而且没有重复路径..Tips:※ 0点作为超级源点和1相连 n+1作为超级汇点和n相连 然后容量为2费用为0 保证一进一出※ 建图的时候..相邻的正反边要紧挨着写.. 因为更改图中的容量的时候.. edge[load[u]].c -= mn; edge[load[u]^1].c += mn; 位运算表示的是反向边..所以加的时候应该紧挨着加..... 阅读全文
posted @ 2012-10-01 23:45 Griselda. 阅读(307) 评论(0) 推荐(0)
摘要:题意:给出供应商供应的商品量和商家需要的商品量以及某个商品在供应商和商家之间的消耗量问商家是否能得到想要的商品量如果可以那怎么安排才是最少花费输入: 给出 n m k 表示有n个商家 m个供应商 k个商品 接下来n行有k个数值表示 第 ni 个商家需要的第k个商品的商品量为ki 接下来m行有k个数值表示 第 mi 个商家需要的第k个商品的商品量为ki 接下来的k个n*m矩阵表示第 ki 个商品 又第 mi 个供应商给第 ni 个商家的消耗 思路: 很明显的最小费用最大流.. 但是建图很特别.. 先求出每个商品的最小花费 然后加起来 固定了超级源点和每个供应商之间的边(容量为供应... 阅读全文
posted @ 2012-10-01 11:22 Griselda. 阅读(241) 评论(0) 推荐(0)
摘要:题意:给出一些部件和他们单个在不同CPU里工作时需要的消耗值以及在两个不同CPU里工作的部件共同工作时的消耗值..问怎么分配可以使总的消耗值最少..输入: n m 表示有n个部件 m个工作连通消耗值 接下来n行每行给出 a b 表示在第一台CPU消耗a 在第二台CPU消耗b 然后m行给出a b w 表示a部件和b部件在不同的机子连通工作需要消耗w..输出: 最少总消耗思路: 最大流 = 最小割Tips: 加入边的时候应该同时加入反向边 还有因为多加了超级源点和超级汇点 所以边也增多了~ 要相应增加边的条数..Code:View Code 1 #include <st... 阅读全文
posted @ 2012-09-29 21:05 Griselda. 阅读(166) 评论(0) 推荐(0)
摘要:题意:有 n 个房子和 n 个人每个人走一个单元你就要付 1$有什么办法可以让把所有人都分派到房子里 而花费最少输入: 给出n m 表示该矩阵由n 行 m 列组成 然后给出一个n*m的图 . 表示空地 H 表示房子 m 表示人思路:二分图最佳匹配<有权还要完全匹配>Tips:建图很有趣~Code:View Code 1 #include <stdio.h> 2 #include <cstring> 3 #include <cmath> 4 #define M 110 5 #define inf 0x1f1f1f1f 6 7 struct Node 阅读全文
posted @ 2012-09-28 08:06 Griselda. 阅读(208) 评论(0) 推荐(0)