2012年10月3日
摘要: 题意:给定一个n个元素的数列,令Ai, Aj, Ak,使得 Ai < Aj > Ak 且 i < j < k这样的三个数为一组。求出一共有多少组。分析:n最大可达50000,常规的暴力枚举的话,复杂度为O(n^2),1s的时限肯定会超时。考虑树状数组:树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,能快速地获取连续几个数的和。令num[i]做c[]的下标,来检索树状数组对于本题数列中每输入一个元素num[i],就在树状数组num[i]位置,即c[num[i]]加1,表示这里有一个数。这样,sum(num[i]-1) ,即c[1]+c[2]+...... 阅读全文
posted @ 2012-10-03 16:38 MicZ 阅读(151) 评论(0) 推荐(0)
  2012年10月1日
摘要: 题意:谣言在n个人之间传播,谣言从一个人传给另一个人需要一定时间(是有向图)。问谣言从哪个人开始传,传遍所有人所用时间最短(这里的时间指的是,传到最后一个人时所用的时间)。输出这个人的编号,及所需要时间。分析:Dijkstra是用来求单源最短路的,而这里起点不确定。采用Floyd算法先对图进行收缩,O(n^3)的复杂度。对每个点,找到这个点做源点时,谣言传遍所有人所需要的“时间”,遍历所有点,找到最短的那个“时间”,复杂度为O(n^2)。对于floyd算法:算法描述:(1) 用数组dis[i][j]来记录i,j之间的最短距离。初始化dis[i][j],若i=j则dis[i][j]=0,若i,j 阅读全文
posted @ 2012-10-01 19:36 MicZ 阅读(234) 评论(0) 推荐(0)
摘要: PrimDijkstra目的最小生成树单源最短路让所有边权值之和最小让每个顶点到源点路径上的权值最小贪心,不断更新每个顶点到整棵树的距离贪心,不断更新每个顶点到源点的距离复杂度O(n^2),可堆优化到O(nlogn)O(n^2),可堆优化到O(nlogn)当图无权时,求最短路,dijkstra算法 可用bfs代替 阅读全文
posted @ 2012-10-01 18:36 MicZ 阅读(241) 评论(0) 推荐(0)
摘要: 题意:给出了城市数n,以及街道数m(街道是双向均可通行的), 对于每一条街mi,给出它的两端的城市,以及所能承载的最大货物运输量。要求输出,从城市1到城市n,最多能运输多少货物。分析:无向、带权图的单源最短路问题。 但这里路径的定义变成了:这条路上权值最小的那段路 的权值(而非所有段的权值之和)。我们的任务就是求出:每一条从1到n的路上,“路径” 的最大值。 这样,就成了求单源最长“路径”。//hoj 1653 //Dijkstra 单源最短路 //注意此题中路长的定义变成了,各段路的权值的最小值 #include <iostream> #include <cstdio> 阅读全文
posted @ 2012-10-01 11:14 MicZ 阅读(152) 评论(0) 推荐(0)
摘要: 题意:平面上有n个点,并给出n个点的坐标。现在要用线把这些点全部连起来。问如何连使得线的总长度最短。分析:是一道裸的最小生成树问题。用Prim算法解决,贴到这儿当模板了。#include <iostream> #include <cstdio> #include <memory.h> #include <cmath> #define N 105 #define INF 0xfffffff using namespace std; struct Point { double x,y; } points[N]; double map[N][N]; b 阅读全文
posted @ 2012-10-01 10:36 MicZ 阅读(155) 评论(0) 推荐(0)
  2012年9月17日
摘要: 网络流最大流的优化算法Dicnic,每一步对原图进行分层,然后用DFS求增广路。时间复杂度是O(n^2*m) 。Poj 3281 和 9.16号成都regional网络赛food那道题,都是很好的模板题。。以food那题为例,这样建图:设一个源点,每一种food为一层,每个人分成两部分,people1 people2两层,每种饮料是一层,然后是一个汇点。每一种食物的个数,即为源点到那种food的流量;饮料同理。每一个人只消耗一种一个食物和一种一个饮料,因此每种食物(或饮料)与人的连线,流量为1people1与people2的间的流量为1模板放这儿先。POJ 3281#include<st 阅读全文
posted @ 2012-09-17 22:36 MicZ 阅读(288) 评论(0) 推荐(0)
  2012年9月3日
摘要: 字符串处理。。题目就不介绍了。应该是一道比较水的题,思路很简单,就是排个序。但是有很多细节要注意,也很考验一些基本功。1.注意字母排序时是不区分大小写的。本来想用现成的sort,但是处理二维数组,并且还要忽略大小写,本弱菜不知道该怎么写了。最后放弃sort,自己写了一个对字符串进行排序的strsort。最朴素的n^2的排序。。还好最后没超时。2.对于数字,可以用atoi这个函数。atoi()会扫描参数nptr字符串,检测到第一个数字或正负符号时开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。然后直接sort即可。3.我用了一个bool types[]记录哪个位置应该出数 阅读全文
posted @ 2012-09-03 23:41 MicZ 阅读(242) 评论(0) 推荐(0)
  2012年9月2日
摘要: 看到题目很容易想到要用DFS,但写出来之后发现TLE了。以为要用其它的算法,百度了下之后发现这题的考点就在于剪枝。刚开始我只用了两个剪枝:各木棍之和是否能被4整除;是否有木棍的长度大于正方形的边长。但事实证明还不够。关键的两个剪枝在DFS里面。具体看代码及注释吧。注意:每一次递归进去,开始搜索的位置的选择,经常是可以进行重要优化的!//DFS+剪枝优化 #include <iostream> #include <cstdio> #include <memory.h> #include <algorithm> using namespace std 阅读全文
posted @ 2012-09-02 23:56 MicZ 阅读(151) 评论(0) 推荐(0)
  2012年8月30日
摘要: 题意:模拟CPU处理多个任务的过程。首先输入任务数n,然后下面n行每行对应一个任务的信息:任务id,到达CPU的时间,处理它所需要的时间,优先级。一个任务在处理过程中,如果有下一个任务到达并且该任务优先级高于正在处理的任务,则要中止当前任务,转而进行下个任务。若是两任务优先级相同,先执行先到达的任务。大致思想:用了两个优先级队列,一个用来存储用户的输入,另一个用来存储已经到达的,正在等待中的任务。还有一个timer记录时钟。详细的参见代码及注释。//用STL里的priority_queue存储,剩下的就是模拟了。。 #include <iostream> #include < 阅读全文
posted @ 2012-08-30 17:06 MicZ 阅读(218) 评论(0) 推荐(0)
  2012年8月28日
摘要: STL之priority_queue【转】STL之priority_queue【转】STL之优先队列原本以为priority_queue很简单,才知道原来懂的只是最简单的形式。头文件:#include<queue>优先队列,也就是原来我们学过的堆,按照自己定义的优先级出队时。默认情况下底层是以Vector实现的heap。既然是队列,也就只有入队、出队、判空、大小的操作,并不具备查找功能。函数列表:empty() 如果优先队列为空,则返回真pop() 删除第一个元素push() 加入一个元素size() 返回优先队列中拥有的元素的个数top() 返回优先队列中有最高优先级的元素用途就 阅读全文
posted @ 2012-08-28 16:30 MicZ 阅读(250) 评论(0) 推荐(0)