
-POJ
文章平均质量分 81
virgoDd
Good afternoon,good evening and good night
展开
-
POJ 1128 Frame Stacking(拓扑排序·打印字典序)
题意 给你一些矩形框堆叠后的俯视图 判断这些矩形框的堆叠顺序 每个矩形框满足每边都至少有一个点可见 输入保证至少有一个解 按字典序输出所有可行解和上一题有点像 只是这个要打印所有的可行方案 建图还是类似 因为每个矩形框的四边都有点可见 所以每个矩形框的左上角和右下角的坐标是可以确定的 然后一个矩形框上有其它字符时 就让这个矩形框对应的字符和那个其它字符建立一个小于关系 由原创 2015-08-20 10:29:13 · 1117 阅读 · 0 评论 -
POJ 1321 棋盘问题(DFS)
题意 中文简单的搜索题 标记列是否已经有子进行深搜即可 k可能小于n 所以每行都有放子或不放子两种选择 #include using namespace std;const int N = 10;int n, k, ans, v[N];char g[N][N];void dfs(int r, int cnt){ if(cnt >= k) ++ans;原创 2015-03-25 20:03:41 · 820 阅读 · 0 评论 -
POJ 3414 Pots(BFS 倒水)
题意 你有两个容积分别为a,b杯子 你每次可以将某个杯子中的水倒满或者倒掉或者倒到另一个杯子 问能否通过这两个杯子量出c容量的水和上一个倒可乐问题类似 只是这个操作更多了点 将两个杯子中各含有的水作为状态 每出队列一个状态 将所有可能到达的状态入队 直到有一个杯子里面水的体积为c 打印路径直接递归就行了#include #include #include usin原创 2015-04-02 17:11:48 · 1032 阅读 · 0 评论 -
POJ 3126 Prime Path(BFS 数字处理)
题意 给你两个4位素数a, b 你每次可以改变a的一位数但要求改变后仍为素数 求a至少改变多少次才能变成b基础的bfs 注意数的处理就行了 出队一个数 然后入队所有可以由这个素数经过一次改变而来的素数 知道得到b#include #include using namespace std;const int N = 10000;int p[N], v[N], d[N],原创 2015-04-02 07:48:30 · 949 阅读 · 0 评论 -
POJ 3087 Shuffle'm Up(模拟)
题意 给两堆牌s1,s2交给你洗 每堆有c张 每次洗牌得到s12 其中s2的最下面一张在s12的最下面一张然后按顺序一张s1一张s2 洗好之后可以把s12下面的c张做s1 上面的c张做s2 求多少次洗牌之后可以得到输入给你的串s 不能得到输出-1简单模拟 s1+s2!=s就一直洗牌 如果回到初始状态都没得到s就不会得到s了 得到s就可以输出洗牌次数了#inclu原创 2014-09-02 09:51:43 · 659 阅读 · 0 评论 -
POJ 1434 Fill the Cisterns!(二分)
题意 有n个互相连通的长方体水箱 给出每个水箱的位置和长宽高 判断放v体积的水时水面的高度 精确到两位小数可以把每个水箱的位置 底面积 和高存起来 然用体积v二分高度 就是要注意精度的处理 最好转换成整数运算import java.util.*;public class Main { static int N = 50005; static long[] b = n原创 2015-03-23 22:36:47 · 865 阅读 · 0 评论 -
POJ 1365 Prime Land
Prime LandTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 2972Accepted: 1362DescriptionEverybody in the Prime Land is using a prime base number syste原创 2014-09-02 09:50:27 · 800 阅读 · 0 评论 -
POJ 3258 River Hopscotch(二分·最小距离最大)
题意 一条河两岸之间有n个石头 求取走m个石头后 使得两个石头间距离的最小值最大感觉关键是理解题意 简单的二分 二分最小距离 看要取走多少个(cnt)石头 cnt#include #include using namespace std;const int N = 50005;int p[N], l, n, m;bool ok(int k){ int原创 2015-03-09 11:33:17 · 1052 阅读 · 0 评论 -
POJ 3279 Fliptile(状压搜索)
题意 把一个n*m矩阵中的1全部变成0所需的最少步数 改变某个格子时其相邻的4个格子也一起改变 只要知道第一行改变了哪些后面的就都确定了 因为上一行对应位置是1的位置必须改变 上一行是0的一定不能改变 所以可以根据第一行的状态推出后面所有行的状态 直到最后一行结束 如果最后一行不是全0的话 这种状态就是不可行的 那么我们只用枚举第一行的所有状态就够了 m#i原创 2015-03-27 11:21:29 · 1676 阅读 · 1 评论 -
hiho一下 37 (无序二分·k小数)
题意 中文可以先排序然后输出第k个 复杂度为O(N*logN) 但有更快的方法 其实二分时只要能保证mid左边的数都比mid小 mid右边的数都比mid大就能进行划分了 对于k不在的区间就不用管了 于是可以用到快排的思想#include using namespace std;const int N = 1000005;int a[N];int main(){原创 2015-03-16 12:49:06 · 1348 阅读 · 0 评论 -
hihoCoder 1078 线段树的区间修改
还是最基础的线段树噢 这次是区间修改#include#include#include#define lc p<<1,s,mid#define rc p<<1|1,mid+1,e#define mid (s+e)/2using namespace std;const int N = 100005;int sum[4 * N], setv[4 * N];void pushup原创 2014-12-11 12:39:49 · 1034 阅读 · 0 评论 -
hihoCoder 1014 Trie树(基础字典树)
题意 中文最基础的字典树应用噢噢噢噢#include#includeusing namespace std;struct trie{ trie *chi[26]; int num; trie() { num = 0; for(int i = 0; i < 26; ++i) chi[i] = N原创 2014-12-11 16:40:28 · 1437 阅读 · 0 评论 -
紫书p199 八数码(BFS,hash)
八连块问题 紫书上的简单搜索 渣渣好久才弄懂#include#includeusing namespace std;const int M = 1000003;int x[4] = { -1, 1, 0, 0}, y[4] = {0, 0, -1, 1};int dis[M], h[M], s[M][9], e[9];int aton(int a[]){ int t原创 2014-12-18 11:09:00 · 1301 阅读 · 0 评论 -
POJ 1077 Eight(BFS Hash)
题意 八数码问题还是八数码问题 只是要输出路径了#include#includeusing namespace std;const int M = 1000003;int e[9] = {1, 2, 3, 4, 5, 6, 7, 8, 0};int x[4] = { -1, 1, 0, 0}, y[4] = {0, 0, -1, 1};int dir[M], pre[M],原创 2014-12-18 12:36:52 · 914 阅读 · 0 评论 -
POJ 1258 Agri-Net(最小生成树 Kruskal)
题意 给你农场的邻接矩阵 求连通所有农场的最小消耗和上一题一样裸的最小生成树#include#include#includeusing namespace std;const int N = 105, M = 10050;int par[N], ans, n, m, t;struct edge { int u, v, w;} e[M];bool cmp(edge a,原创 2014-10-22 10:37:18 · 1469 阅读 · 0 评论 -
POJ 1426 Find The Multiple(BFS 同余模定理)
题意 给你一个数n 输出一个仅由0,1组成的数m使得m是n的倍数找到一个m 是m%n==0 就行了 初始让m=1 然后bfs扩展m的位数 只有两种情况 m = m * 10 或 m = m*10 + 1; 同余模定理 (a+b) % c = (a%c + b%c) % c, (a*b)%c = (a%c * b%c) % c;运用同余模定理 可以只记录余数 这原创 2015-04-01 21:34:24 · 743 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化 线段树 贴海报)
题意 在墙上贴n张海报 输入每张海报的的左右端点坐标 问最后可以看到多少张海报 能看到一点也是能看到先把线段树初始化为0 输入一张海报 就把那个区间变成这张海报的序号 最后判断墙上有多少个不同的序号就行了但是海报坐标的端点值高达10000000 直接用线段树会超时 但是注意到海报最多只有10000张 也就是最多有20000个不同的坐标 于是可以利用离散化的知识 把原创 2015-04-18 19:06:56 · 2067 阅读 · 0 评论 -
POJ 2585 Window Pains(拓扑排序·窗口覆盖)
题意 有一个4*4的显示器 有9个程序 每个程序占2*2个格子 他们的位置如图所示 当你运行某个程序时 这个程序就会显示在顶层覆盖其它的程序 给你某个时刻显示器的截图 判断此时电脑是否死机了(出现了不合法的覆盖关系)拓扑排序的应用 关键是建图 当一个程序A的区域上有其它程序B时 说明A是在B之前运行的 那么我们可以建立一个A#include #include #原创 2015-08-19 16:11:44 · 1106 阅读 · 0 评论 -
POJ 1094 Sorting It All Out(拓扑排序·判断+实现)
题意 由一些不同元素组成的升序序列是可以用若干个小于号将所有的元素按从小到大的顺序 排列起来的序列。例如,排序后的序列为 A, B, C, D,这意味着 A 每来一个小于关系就进行一次拓扑排序 直到出现冲突(也就是出现了环)或者已经能确定顺序 当结果已经确定时 后面的小于关系也就没有必要处理了 因此可以用一个flag标记结果是否已经确定#include #include #i原创 2015-08-19 14:59:12 · 2278 阅读 · 0 评论 -
POJ 2991 Crane(线段树·向量旋转)
题意 有一个Crane由n条线段连接组成 每个连接点处均可以任意旋转 给你n条线段的长度 然后又m次旋转操作 给你p和r 将第p和第p+1条线段之间的角度旋转为r 即第p条线段绕p的终点逆时针旋转r度后能够与第p+1条重合 问每次旋转后最后一条线段的终点坐标可以发现 旋转第p+1条线段时 p+1后面的所有线段也一起旋转了 可以把Crane分解为n个向量 这些向量原创 2015-08-16 15:16:48 · 1000 阅读 · 0 评论 -
POJ 1167 (DFS·剪枝·公交时刻表)
题意 你记录了[0, 59]这个时间段内到达你所在站牌的所有公交的到这个站牌的时间 对于每路公交1. 同一路公交的到站时间间隔是相同的2. 每路公交在这个时间段至少到达两次3. 最多有17路公交4. 两个不同路的公交的第一次到站时间和到站时间间隔都可能是相同滴5. 你在这个时间段内的记录是完整的求最少用多少路公交可以让你的记录合法由于每路公交至少到站两次 那么第一原创 2015-08-03 16:30:48 · 1883 阅读 · 0 评论 -
POJ 3411 Paid Roads(DFS)
题意 你要从第1个城市到第N个城市去 有m条路 每条路用a, b, c, p, r 表示 你从第a个城市到第b个城市时 若之前经过或现在位于第c个城市 过路费就是p元 否则就是r元 求你到达第N个城市最少用多少过路费由于最多只有10个城市 10条路 这个题就变得很简单了 直接暴力dfs就行 可以用状态压缩来存储已经走过了哪些城市 由于最多只有10条路 从某个城市原创 2015-08-03 16:04:47 · 850 阅读 · 0 评论 -
POJ 2299 Ultra-QuickSort(归并排序·树状数组·逆序对)
题意 给你一个数组求其中逆序对(ia[j])的个数 我们来看一个归并排序的过程:给定的数组为[2, 4, 5, 3, 1],二分后的数组分别为[2, 4, 5], [1, 3],假设我们已经完成了子过程,现在进行到该数组的“并”操作:a: [2, 4, 5]b: [1, 3]result:[1]选取b数组的1原创 2015-04-10 20:27:30 · 802 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与另一条线段之间可以连一条平行与x轴的线不与其它线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见先把所有线段存下来 并按x坐标排序 线段树记录对应区间从右往左当前可见的线段编号(1...n) 超过一条就为0 然后从左往右对每条线段 先查询左边哪些线段和它是可见的 把可见关系存到数组中 然后把这条线段对应区间的原创 2015-07-15 15:58:17 · 823 阅读 · 0 评论 -
POJ 2886 Who Gets the Most Candies?(线段树·约瑟夫环)
题意 n个人顺时针围成一圈玩约瑟夫游戏 每个人手上有一个数val[i] 开始第k个人出队 若val[k] 0 时向左数val[k]个 第m出队的人可以得到m的约数个数个糖果 问得到最多糖果的人是谁约瑟夫环问题 n比较大 直接模拟会超时 通过线段树可以让每次出队在O(logN)时间内完成 类似上一道插队的题 线段树维护对应区间还有多少个人没出队 那么当我们知道出队的人原创 2015-07-13 20:23:47 · 1151 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树·插队)
题意 n个人排队 每个人都有个属性值 依次输入n个pos[i] val[i] 表示第i个人直接插到当前第pos[i]个人后面 他的属性值为val[i] 要求最后依次输出队中各个人的属性值从头到尾看的话 队列是动态的 无法操作 但是反过来看时 pos[i]就可以表示第i个人前面还有多少个人了 然后想到了用线段树做就简单了 线段树维护对应区间还有多少个空位 每次把i放原创 2015-07-13 12:25:10 · 781 阅读 · 0 评论 -
POJ 2823 Sliding Window(单调队列)
题意 长度为n的数组上有个长度为k的滑窗从左向右移动 求每次移动后滑窗区间的最小值和最大值 输出两行 第一行所有最小值 第二行所有最大值可以用线段树来做 但是单调队列更简单 单调递增队列: 队尾单调入队(入队元素大于队尾元素时直接入队 否则队尾出队直到队尾元素小于入队元素或者队列为空) 队首队尾都可以出队求最小值时 先判断队首元素是否在滑窗之内 不在队首就出队 然后原创 2015-07-06 12:28:21 · 2683 阅读 · 0 评论 -
hiho一下·41 骨牌覆盖问题·一(矩阵快速幂·费波拉契)
题意 求费波拉契数列第N项 1≤N≤100,000,000通过矩阵的幂 可以把一维递推的时间复杂度减小到O(logN) 主要就是快速幂的思想 对于m^n 若n=2^a1+2^a2+...+2^ak 那么m^n = m^(2^a1) * m^(2^a2) * ... * m^(2^ak) 那么只用看n转换为二进制后哪些位为1就可以快速求出m^n了#include原创 2015-04-13 17:09:52 · 970 阅读 · 0 评论 -
POJ 3461 Oulipo (KMP字符串匹配·统计p在s中出现次数)
题意 给你两个字符串p和s 求p在s中出现的次数 很裸的kmp因为不止匹配一次 每次找到后还要循环j=next[j]的过程 知道到达s的终点#include#includeusing namespace std;const int N = 10005, M = 1000005;int next[N], ans, n;char p[N], s[M];void k原创 2014-09-02 09:51:32 · 1085 阅读 · 0 评论 -
hiho一下·47 拓扑排序·一(判断是否能够Topo排序)
题意 中文简单的Topo排序 用vector实现邻接表比较方便#include using namespace std;const int N = 1e5 + 5;vector e[N];vector::iterator it;int n, m, ideg[N];bool topo(){ int cur; queue q; for(int i原创 2015-05-25 09:35:31 · 1624 阅读 · 0 评论 -
Codeforces 534B Covered Path(贪心)
题意 你在路上走 每秒钟的开始都可以改变自己的速度(改变速度都是瞬间完成的) 知道你开始的速度v1 结束时的速度v2 整个过程所用时间t 以及每秒最多改变的速度d 求这段时间内你最多走了多远最优的肯定是先把速度从v1升到最大 然后从最大减到v2 使得用的时间不会超多t 因为肯定是足够从v1减为或升到v2的 那么我们只用从两端往中间靠 哪边的速度小 哪边就加上d 知道原创 2015-04-13 17:29:27 · 893 阅读 · 0 评论 -
POJ 2253 Frogger(最小最大距离)
题意 给你n个点的坐标 求第1个点到第2个点的所有路径中两点间最大距离的最小值 很水的floyd咯#include#include#include#includeusing namespace std;const int N=205;double d[N][N];int x[N],y[N],n;void floyd(){ for(int k=1;k<=n;原创 2014-10-30 23:02:03 · 1268 阅读 · 0 评论 -
POJ 2570 Fiber Network(最短路 二进制处理)
题目翻译一些公司决定搭建一个更快的网络,称为“光纤网”。他们已经在全世界建立了许多站点,这 些站点的作用类似于路由器。不幸的是,这些公司在关于站点之间的接线问题上存在争论,这样“光纤网”项目就被迫终止了,留下的是每个公司自己在某些站点之间铺设的线路。 现在,Internet 服务供应商,当想从站点 A传送数据到站点 B,就感到困惑了,到底哪个公司 能够提供必要的连接。请帮助供应商回答他们的查询原创 2014-10-30 22:15:14 · 1026 阅读 · 0 评论 -
POJ 1979 Red and Black(DFS 连通块中元素数量)
题意 求矩阵中包含‘@’的'.'连通块中元素数量 '@'也看做'.' 最基础的dfs了#include#includeusing namespace std;const int N = 30;char mat[N][N];int dx[4] = {0, 0, -1, 1}, dy[4] = { -1, 1, 0, 0};int ans;void dfs(int r, i原创 2014-10-13 11:36:27 · 974 阅读 · 0 评论 -
POJ 3934 Queue(DP)
QueueDescriptionLinda is a teacher in ACM kindergarten. She is in charge of n kids. Because the dinning hall is a little bit far away from the classroom, those n kids have to walk in line to t原创 2014-09-02 09:51:03 · 490 阅读 · 0 评论 -
POJ 3282 Ferry Loading IV(模拟,队列)
题意 汽车通过渡船过河 渡船开始在左边 输入按车辆来的顺序输入河两岸的车 渡船每次运输的汽车的总长度不能超过渡船自己本身的长度 先来的车先走 求轮船至少跨河多少次才能将所有的车辆都运完简单模拟 建两个队列 分别装左边的车 和右边的车 算出两边各至少需要运输多少次就行了#include#include#includeusing namespace std;原创 2014-09-02 09:51:45 · 679 阅读 · 0 评论 -
POJ 1856 Sea Battle(DFS)
题意 图中每个矩形'#'连通块代表一艘船 若一艘船与另一艘有边相邻或有角相邻 那么认为这两艘船相撞 若图中有船相撞 输出bad 否则输出图中有多少艘船可以把图的周围全包上一圈'.' 遍历图中每个点 可知当图中存在一下四种结构中的一个时 必有船相撞 输出并退出循环 否则则dfs这个点 若图中不存在这些结构 就可以输出连通块数量即轮船数了#include原创 2014-09-02 09:51:39 · 608 阅读 · 0 评论 -
POJ 1205 Water Treatment Plants(递推)
题意 建设一条河岸的污水处理系统 河岸有n个城市 每个城市都可以自己处理污水 V 也可以把污水传到相邻的城市处理 >或令d[i]表示有i个城市时的处理方法数 最后一个城市的处理方法有1.V 自己处理自己的 与前i-1个城市的处理方法无关 有d[i-1]种方法2.3.>V 左边有污水传过来 和自己的一起处理 这时第i-1个城市可以向右传了 如果这种情况发生的原创 2014-09-02 09:51:36 · 756 阅读 · 0 评论 -
POJ 3370 Halloween treats(抽屉原理)
题意 有c个小孩 n个大人万圣节搞活动 当小孩进入第i个大人家里时 这个大人就会给小孩a[i]个糖果 求小孩去哪几个大人家可以保证得到的糖果总数是小孩数c的整数倍 多种方案满足输出任意一种用s[i]表示前i个打人给糖果数的总和 令s[0]=0 那么s[i]共有n+1种不同值 而s[i]%c最多有c种不同值 题目说了c这就是抽屉原理了 n个抽屉放大于n个苹果原创 2014-09-02 09:52:10 · 733 阅读 · 0 评论 -
UESTC 890 Card Trick(DP 纸牌魔术)
题意 给你一些牌 全部正面朝下放桌子上 你选一个起点 翻开那张牌 牌上的数字是几就向前走几步 J,Q,K 都是向前走10步 A向前走11步 知道向前走对应的步数后超过了终点 输入n m 和n个数 代表你以第m张牌为起点 依次掀开了n张牌就不能再掀了 然后同样的牌 Alice以1-10张牌中的任意一个为起点 求Alice最后的终点与你的终点相同的原创 2014-08-28 10:43:05 · 1869 阅读 · 0 评论