
POJ
stdwal
天演在化,功成在学。知海无涯,见花问道。
展开
-
POJ3617-Best Cow Line
给定长度为N的字符串S,要求构造一个字典序最小的字符串T。#include const int MAXN = 2000;char s[MAXN+2];char t[MAXN+2];int main(){ int n; scanf("%d", &n); getchar(); int i; for (i = 0; i < n; i+原创 2016-03-31 09:55:21 · 285 阅读 · 0 评论 -
POJ1852-Ants
买了本《挑战程序设计竞赛》,打算静下心好好啃完一本书。“事实上,可以知道两只蚂蚁相遇后,当它们保持原样交错而过继续前进也不会有任何问题。”#include #include #include using namespace std;const int MAXN = 1000000;int loc[MAXN];int main(){ int t; scan原创 2016-03-30 15:34:49 · 261 阅读 · 0 评论 -
POJ1979-Red and Black
图的深搜。#include #include const int MAXN = 20;char map[MAXN+2][MAXN+2];int cnt = 0;int w, h;void Dfs(int x, int y){ cnt++; map[x][y] = '#'; if (x - 1 >= 0 && map[x-1][y] == '.原创 2016-03-31 17:02:49 · 293 阅读 · 0 评论 -
POJ3187-Backward Digit Sums
暴力搜索。#include #include #include using namespace std;int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int list[10][10];int ans[12] = {9, 9};int sub[12];int n, fsum;void cmp(){ int i; fo原创 2016-04-03 20:10:10 · 277 阅读 · 0 评论 -
POJ2718-Smallest Difference
给定一组数,求由这组数中的两个数相减的最小值。要注意的是其中的两个数不能是0开头的,即012 != 12。对数据进行全排列,枚举所有情况取最小即可。#include #include #include #include #include using namespace std;const int INF = 0xfffffff;int main(){ in原创 2016-04-03 13:34:42 · 347 阅读 · 0 评论 -
POJ3050-Hopscotch
题目除了题意难以理解,总的实现还是简单的。一群牛在进行一个跳房子的游戏。牛可以在任意一点上向前后左右四个方向跳格子,跳五次后得到含有六个数字的数字串。问这样的数字串有多少个。#include #include using namespace std;int grid[6][6];int dx[4] = {-1, 0, 1, 0};int dy[4] = {0, -1,原创 2016-04-04 11:13:56 · 1185 阅读 · 0 评论 -
POJ1328-Radar Installation
一开始以为将各个小岛的坐标排序从最左端开始找到使该小岛在雷达边缘的雷达坐标进行贪心即可。事实证明:我还是太年轻......正确做法是将每个小岛坐标求出圆心所在的区间,区间重合的地方就是雷达的设置点。#include #include #include #include #include using namespace std;const int MAXN = 1000;原创 2016-04-08 23:54:49 · 290 阅读 · 0 评论 -
POJ2010-Moo University - Financial Aid
将每个学生先按照分数排序,再以每个学生作为中间点,在优先队列的帮助下分别找到在比这名学生前面和后面援助金额之和最少的(n-1)/2名学生,在数组lower和upper中记录金额。总金额为该学生的援助金与他前后n-1个学生的援助金之和。遍历所有解的时候需要从大往小遍历(元素越多,固定为n个元素之和才有可能越小),第一个满足总金额小于等于基金的即为最优解。#include #includ原创 2016-04-25 18:11:26 · 339 阅读 · 0 评论 -
POJ3253-Fence Repair
将题目想成一棵二叉树,一块木板为父节点,切割后的两段长度为它的子节点。如此切割的开销为父节点木板对应的长度。总开销为所有含有子节点的父节点对应长度只和。等于这棵树的各叶节点乘以节点的深度。因此最短的板应是深度最大的叶子节点之一。最短的板与次短的板的节点是兄弟节点。将l按大小顺序排序,最短的板l1和次短的板l2是由长度为(l1+l2)的板得到的。递归地将这n-1块木板的问原创 2016-03-31 16:00:06 · 415 阅读 · 0 评论 -
POJ2385-Apple Catching
简单dp。dp[i][j]表示在第i分钟,走了第j步后所得的苹果数。因此dp[i][j]取决于dp[i-1][j-1]和dp[i-1][j],以及所在的树上是否掉落苹果。#include #include using namespace std;const int MAXT = 1000;const int MAXW = 30;int dp[MAXT+2][MAXW+2原创 2016-04-26 19:04:14 · 279 阅读 · 0 评论 -
POJ2393-Yogurt factory
夭寿啦!一群牛打算发家致富卖酸奶啦!这是一道简单的贪心问题,将每两周的两种情况(每周生产和前一周生产下一周的酸奶)的价格进行比对选择价格小的即可。#include #include #include using namespace std;typedef pair week;const int MAXN = 10000;week cy[MAXN+2];int main原创 2016-04-10 13:47:44 · 385 阅读 · 0 评论 -
POJ1017-Packets
题目大意是某公司有不同规格的产品1*1,2*2,3*3,4*4,5*5,6*6。要将这些产品放入几个大小为6*6的包裹,问最少需要几个包裹。感谢Discuss和百度上大神们的优秀算法。首先最好能填满每个包裹或使包裹最后剩余空间越少越好,且每个包裹装的产品越多越好。总的来说每个6*6,5*5,4*4的产品放入一个包裹,将几个3*3的产品放入一个包裹,包裹的剩余空间先用2*2的填充,再原创 2016-04-11 12:29:30 · 446 阅读 · 0 评论 -
POJ3009-Curling 2.0
外星人打冰球的故事。这是一道深搜的题,与一般的题不同之处在于它并不是走一格,而是走一条直线路径。#include #include #include using namespace std;const int MAXN = 20;int map[MAXN+2][MAXN+2];int dx[4] = {1, 0, -1, 0};int dy[4] = {0, 1,原创 2016-03-31 21:22:20 · 484 阅读 · 0 评论 -
POJ1182-食物链
该题有三种动物,我们可以把一个并查集分成三份:x,x+n, x+2n分别表示A,B,C三种动物。当x与y是同类时,x与y可能是三种动物中的任意一种,则将(x, y)、(x+n, y+n)、(x+2n, y+2n)合并。当x吃y时,x与y可能是三种捕食关系中的一种,则合并A吃B(x, y+n)、B吃C(x+n, y+2n)、C吃A(x+2n, y)。于是,当x,y处于同一个n内表示x,y原创 2016-04-27 12:52:38 · 342 阅读 · 0 评论 -
POJ2386-Lake Counting
#include const int MAXN = 100;char field[MAXN+2][MAXN+2];int n, m;void Dfs(int x, int y){ if (field[x][y] == 'W') { field[x][y] = '.'; for (int dx = -1; dx <= 1; dx原创 2016-03-30 16:47:41 · 294 阅读 · 0 评论 -
POJ1164-The Castle
将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(V){ if (v访问过) { return; } 将v标记为访问过; 对和v相邻的每个点u:Dfs(u);}int main(){ while (在图中能找到未访问过的点k) { Dfs(k); }}Poj原创 2016-03-20 13:13:57 · 621 阅读 · 0 评论 -
POJ3278-Catch That Cow
典型的宽搜入门题。注意边界条件。#include #include #include using namespace std;const int MAX_N = 100000;typedef pair P;queue q;bool vis[MAX_N+1];int Bfs(int n, int k){ bool find_ans = false; q原创 2016-04-07 11:00:28 · 326 阅读 · 0 评论 -
POJ3669-Meteor Shower
这是一道典型宽搜的题。题目的注意点有很多:300*300是流星的陨落范围,不是地图的大小。因此302是绝对的安全区域。同一位置可能会有许多流星,这是应选择最早的那个进行状态标记。t的范围是[0,1000],闭区间。所以存在刚开始就死在原点的可能性。(太惨了....)同一队列中不同元素的时间可能是不同的,不能一概而论。已访问过的点不必再访问。#include #in原创 2016-04-02 09:57:23 · 452 阅读 · 0 评论 -
POJ3176-Cow Bowling
这么多天对DP还是研究的不够透彻,DP入门第一题。初始条件为dp[0][0]=tip的值,其余dp[i][j]取决于dp[i-1][j]和dp[i-1][j-1]和本身dp[i][j]的值。#include #include #include using namespace std;const int MAXN = 350;int bowl[MAXN+5][MAXN+5];原创 2016-04-17 17:03:49 · 306 阅读 · 0 评论 -
POJ2229-Sumsets
一开始想的很复杂还列了一个2的幂次表,最后还是被困住了。在Discuss里看到了一个巨巨的思路,不仅高效而且简明:dp[i]为数字i的最多组合数。将i分奇偶考虑:如果i是奇数,i的任意一个组合都包含1,即dp[i-1]的每一种组合后+1,因此dp[i] = dp[i-1]。如果i是偶数,i的组合数为i-1的组合数(每种组合后+1)以及i / 2的组合数(每种组合*2)之和。原创 2016-04-18 21:15:52 · 320 阅读 · 0 评论 -
POJ3255-Roadblocks
寻找次短路。令dis[]为点到源点的最小距离,dist[]为点到终点的最小距离。由此可知dis[u] + dist[u]为从源点到终点的最短路。dis[u] + cost[u][v] + dist[v]表示源点通过uv边到终点,次短路一定是其中比最短路大比其他路小的值。因此只要求出每个点到源点的距离和每个点到终点的距离即可。#include #include #includ原创 2016-05-26 20:25:36 · 377 阅读 · 0 评论 -
POJ3616-Milking Time
首先将Bessie休息的时间纳入挤奶的时间内,按开始时间从小到大排序。然后用每个挤奶时间内的牛奶量初始化dp数组,dp[i]表示从开始到第i个时间内收益的最大值。显然dp[i] = 从0 - i 时间段内的最大收益+当前第i个时间段内收益。#include #include using namespace std;const int MAXM = 1000;struct原创 2016-05-04 13:51:44 · 301 阅读 · 0 评论 -
POJ3723-Conscription
将男女之间的关系看作一条边,想要费用最少就是找出一个最小生成树。将边从小到大排序后,利用并查集将未连结的两点相连,便是最小生成树。由于费用减免只能用于一人,我们将两人之间的费用减免(-d)作为边的权值。求出最小生成树后将所有人的费用减去最大的所有的费用减免即是最小的费用。#include #include using namespace std;const int max原创 2016-05-27 19:36:31 · 343 阅读 · 0 评论 -
POJ3169-Layout
首先,牛是按照编号排序的,所以有d[i]其次,对于每对关系好的牛之间都有d[Al]+Dl>=d[Bl]。同样,对于每对关系不好的牛之间都有d[Ad]+Ddd[i]=d[i],因此从顶点i+1向顶点i连一条权值为0的边。同样,d[Al]+Dl>=d[Bl]对应从顶点Al向顶点Bl连一条权值为d[Bl]的边。d[Ad]+Dd所求问题是d[n]-d[1]的最大值,对应顶点1到顶点原创 2016-05-27 22:42:41 · 291 阅读 · 0 评论 -
POJ1062-昂贵的聘礼
取源点为0,首先建立从0到各个编号的物品的单向边,权值为物品价格。由于一个物品a需要用另一个物品b来优惠,因此建立从b到a的单向边,权值为优惠后的价格。枚举在物品1(酋长的允诺)的地位lev[1]-m范围内的物品地位i在地位i+m的可交易范围内到源点的最短路。则d[1]就是最小的金额。#include #include #include #include #include原创 2016-05-28 16:37:02 · 351 阅读 · 0 评论 -
POJ2236-Wireless Network
以电脑之间的连通关系建立并查集,连接符合条件的电脑并检查连通性即可。#include #include #include using namespace std;typedef pair P;const int MAXN = 1001;int par[MAXN+5];int high[MAXN+5];bool status[MAXN+5];P com[MAXN+5];原创 2016-05-16 09:05:07 · 404 阅读 · 0 评论 -
POJ3040-Allowance
这道题的思路十分的简单。大于等于c的面额每周付一次,即面额数等于周数。剩下的小于c的面额,从大到小取钱,未到c的用从小到大的面额填充,从而减少浪费。但是明白了题目的套路还不够,实现起来有一些小困难。#include #include #include #include using namespace std;typedef pair P;const int INF原创 2016-04-20 17:01:55 · 588 阅读 · 0 评论 -
POJ2253-Frogger
题目要求找出点0到点1在每个路径中跳跃距离的最大值中最小的一个。首先初始化数组d,d[i][j]表示从点i跳到点j的最小跳跃距离。将Floyed-Warshall算法变形一下,用临时变量存取从点i跳到点k的最小跳跃距离与点k到点j的最小跳跃距离中的最大值(同一路径取最大值)将该临时变量与以求得的最短跳跃距离d[i][j]比较,取里面最小的一个。#include #includ原创 2016-05-28 21:44:54 · 362 阅读 · 0 评论 -
POJ3262-Protecting the Flowers
这道题的关键在于如何对这些牛进行排序。设有两头牛分别为a, b。a = (Ta, Da),b = (Tb, Db)则先传送a回牛棚损失2Ta * Db;先传送b损失2Tb * Da; 因此排序时选择损失较小的,即每次选取最优解。#include #include using namespace std;typedef pair P;const int MAXN原创 2016-04-21 13:13:48 · 291 阅读 · 0 评论 -
POJ3614-Sunscreen
每一种防晒霜可以给多个牛使用,这时候该如何决策呢?维护一个优先队列,按maxSPF从小到大的顺序排列。这是为了尽量把SPF小的防晒霜给maxSPF小的牛。首先将牛和防晒霜进行排序,然后按防晒霜的SPF从小到大分配给可用的牛。#include #include #include #include using namespace std;typedef pair P;原创 2016-04-21 18:35:29 · 545 阅读 · 0 评论 -
POJ2431-Expedition
卡车在经过加油站之后需要加油时,可视为在之前经过的加油站加的油。在卡车没油的时候用优先队列提取出先前经过的加油站中油量最多的。#include #include #include #include using namespace std;const int MAXN = 10000;typedef pair fuel;priority_queue que;fuel st原创 2016-04-12 13:33:01 · 391 阅读 · 0 评论 -
POJ3190-Stall Reservations
先对每头牛进行从早到晚的排序。由于需要为每个牛分配牛棚并输出,维护一个数组t表示第i头牛位于哪一个牛棚。维护一个以结束时间为标准从小到大的优先队列,每次提取出最早结束的牛棚,判断是否可用,如果可用的话标记,不可用则新建一个牛棚。最后输出即可。#include #include #include using namespace std;const int MAXN = 50原创 2016-05-18 13:20:49 · 498 阅读 · 0 评论 -
POJ2240-Arbitrage
货币套利问题。每种货币根据不同汇率兑换到不同的货币再兑换回原货币,如果价值比原来更高即是套利。这个一个多源问题,利用Floyd变形即可。#include #include #include #include #include #include using namespace std;const int MAXN = 35;double G[MAXN][MAXN];ma原创 2016-06-02 09:39:19 · 386 阅读 · 0 评论 -
POJ1988-Cube Stacking
这是一题带权值的并查集问题,并在move过程中规定了x, y连边的方向,因此在优化的过程中要记下每个节点到根的相对位置,并通过路径压缩将每个节点挂在每堆的最顶上的元素(父节点)。用数组par纪录每个节点的父节点,数组far纪录每个节点到父节点的相对距离,数组stk纪录以某元素为父节点的堆的节点(方块)数。本题中的关键在于find函数通过递归方式进行的路径压缩,find函数的递归实现是本题的中心原创 2016-05-09 21:33:15 · 312 阅读 · 0 评论 -
POJ3280-Cheapest Palindrome
动态规划。dp[i][j]表示把从id[i]到id[j]改成回文串的最小代价。因此每次dp[i][j]都将从规模更小的dp[i+1][j]和dp[i][j-1]中选择最优解。通过每次迭代,dp[i+1][j]是回文串,dp[i][j-1]也是回文串。设从id[i+1]到id[j]的回文串为xxyy则从id[i]到id[j]的字符串为axxyy,这时可以将该字符串改成axxyya原创 2016-05-22 00:52:09 · 323 阅读 · 0 评论 -
POJ2139-Six Degrees of Cowvin Bacon
题目的意思是在同一电影中每头牛的距离都为1用floyd就能简单的做出来。#include #include using namespace std;const int maxn = 300 + 10;const int inf = 10000;int d[maxn][maxn];int tmp[maxn];void floyd(int n) { for (in原创 2016-07-10 14:00:33 · 364 阅读 · 0 评论 -
POJ3641-Pseudoprime numbers
题目给出两个数p, a,要求根据费马小定理检验p是不是个伪素数。用快速幂来做。另外,不能直接将a^p == a(mod p)化成a^p-1 == 1(mod p)来做,因为转换的条件是a不是p的倍数。(贡献一wa)#include bool isprime(int n) { for (int i = 2; i * i <= n; i++) { if (n %原创 2016-07-22 16:24:02 · 214 阅读 · 0 评论 -
POJ3258-River Hopscotch
经典的二分,理解起来稍难....#include #include using namespace std;const int maxn = 50000+10;int rock[maxn];bool judge(int x, int n, int m) { int last = 0; for (int i = 1; i < n - m; i++) {原创 2016-07-23 13:16:45 · 274 阅读 · 0 评论 -
POJ2456-Aggressive cows
通过二分搜索贪心的判断条件是否成立即可。#include #include using namespace std;const int maxn = 100000 + 5;const int inf = 10e9 + 10;int stall[maxn];bool judge(int d, int n, int c) { int last = 0; for原创 2016-07-22 20:53:24 · 280 阅读 · 0 评论 -
POJ1064-Cable master
题目出的也是十分的坑。数据范围从1meter到100kilometers....解题的思路大致就是二分搜索,次数大概在100次左右。答案输出需要floor(ans*100)/100来避免最后答案四舍五入。#include #include const int maxn = 10000;double cab[maxn];bool judge(double a, int原创 2016-07-22 19:59:12 · 438 阅读 · 0 评论