自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Collider

愿所有刷过的题都成为你比赛中信手拈来的水题.

  • 博客(23)
  • 收藏
  • 关注

原创 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 313

原创 数据结构-并查集

并查集可以高效的查询元素a和元素b是否属于同一组并且合并元素a和元素b所在的组。并查集虽然可以进行合并操作,但是无法进行分割操作。在并查集中,哪个节点是哪个节点的父亲以及树的形状等信息无需多加关注,整体组成一个树形结构才是重要的。对于每棵树,记录这棵树的高度(rank)。合并时如果两棵树的rank不同,那么从rank小的向rank大的连边。此外,通过路径压缩可以使并查集

2016-04-26 20:04:43 257

原创 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 256

原创 POJ2010-Moo University - Financial Aid

将每个学生先按照分数排序,再以每个学生作为中间点,在优先队列的帮助下分别找到在比这名学生前面和后面援助金额之和最少的(n-1)/2名学生,在数组lower和upper中记录金额。总金额为该学生的援助金与他前后n-1个学生的援助金之和。遍历所有解的时候需要从大往小遍历(元素越多,固定为n个元素之和才有可能越小),第一个满足总金额小于等于基金的即为最优解。#include #includ

2016-04-25 18:11:26 323

原创 POJ3614-Sunscreen

每一种防晒霜可以给多个牛使用,这时候该如何决策呢?维护一个优先队列,按maxSPF从小到大的顺序排列。这是为了尽量把SPF小的防晒霜给maxSPF小的牛。首先将牛和防晒霜进行排序,然后按防晒霜的SPF从小到大分配给可用的牛。#include #include #include #include using namespace std;typedef pair P;

2016-04-21 18:35:29 522

原创 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 273

原创 POJ1862-Stripies

这题是基本不等式啊,每次选取质量m最大的两个stripy进行碰撞结合,能够得到最小的质量。所有只要维护一个优先队列就可以了。#include #include #include using namespace std;priority_queue que;int main(){ int n; scanf("%d", &n); for

2016-04-21 10:51:42 589

原创 POJ3040-Allowance

这道题的思路十分的简单。大于等于c的面额每周付一次,即面额数等于周数。剩下的小于c的面额,从大到小取钱,未到c的用从小到大的面额填充,从而减少浪费。但是明白了题目的套路还不够,实现起来有一些小困难。#include #include #include #include using namespace std;typedef pair P;const int INF

2016-04-20 17:01:55 558

原创 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 287

原创 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 288

原创 数据结构-二叉搜索树

二叉搜索树的所有节点都满足左子树上的所有节点都比自己小,而右子树上的所有节点都比自己大这一条件。当删除某个节点时,需要根据下面几种情况分别进行处理:需要删除的节点没有左儿子,那么就把右儿子提上去。需要删除的节点的左儿子没有右儿子,那么就把左儿子提上去。以上两种情况都不满足的话,就把左儿子的子孙(左子树)中最大的节点提到需要删除的节点上。struct node{ int

2016-04-14 16:40:28 226

原创 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 374

原创 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 422

原创 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 364

原创 POJ1328-Radar Installation

一开始以为将各个小岛的坐标排序从最左端开始找到使该小岛在雷达边缘的雷达坐标进行贪心即可。事实证明:我还是太年轻......正确做法是将每个小岛坐标求出圆心所在的区间,区间重合的地方就是雷达的设置点。#include #include #include #include #include using namespace std;const int MAXN = 1000;

2016-04-08 23:54:49 275

原创 数据结构-堆

堆最重要的性质就是儿子的值一定不小于父亲的值。除此之外,树的节点是按从上到下、从左到右的顺序紧凑排列的。在向堆中插入数值时,首先在堆的末尾插入该数值,然后不断向上提升直到没有大小颠倒为止。从堆中删除最小值时,首先把堆的最后一个节点的数值复制到根节点上,并且删除最后一个节点。然后不断向下交换直到没有大小颠倒为止。在向下交换的过程中,如果有2个儿子,那么选择数值较小的儿子(如果儿子比自己小的话

2016-04-08 17:39:11 240

原创 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 304

原创 01背包问题

01背包问题有n个重量和价值分别为wi,vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。1 1001 1001 10000int n, W;int w[MAX_n], v[MAX_n];//从第i个物品开始挑选总重小于j的部分int rec(int i, int j){ int res; if (i

2016-04-06 15:18:37 361

原创 POJ2376-Cleaning Shifts

在t个shift,n头牛中选择用最少的牛完成所有的shift。明显是个贪心的题。只要每次找出最晚结束shift的牛即可找到最优解。#include #include #include using namespace std;const int maxn = 25000;typedef pair cow;cow itv[maxn+2];int comp(cow a,

2016-04-05 17:36:57 461

原创 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 1137

原创 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 265

原创 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 322

原创 POJ3669-Meteor Shower

这是一道典型宽搜的题。题目的注意点有很多:300*300是流星的陨落范围,不是地图的大小。因此302是绝对的安全区域。同一位置可能会有许多流星,这是应选择最早的那个进行状态标记。t的范围是[0,1000],闭区间。所以存在刚开始就死在原点的可能性。(太惨了....)同一队列中不同元素的时间可能是不同的,不能一概而论。已访问过的点不必再访问。#include #in

2016-04-02 09:57:23 396

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除