07 2015 档案
摘要:思路别人那里讲的很清楚了,我就不阐述了。链接 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int MAXN=250+5; 7 int n; 8 struct Big 9 {10 int ...
阅读全文
摘要:【思路】以每一座岛屿为圆心,雷达范围为半径作圆,记录下与x轴的左右交点。如果与x轴没交点,则直接退出输出“-1”。以左交点为关键字进行排序,从左到右进行贪心。容易知道,离每一个雷达最远的那一座岛与雷达相距恰巧为半径的时候,可以得到最优解。假设上一个雷达与第before座岛相距为半径大小,对于当前的岛...
阅读全文
摘要:由于数据规模不大,利用爆搜即可。第一次用位运算写的,但是转念一想应该用递归更加快,因为位运算没有剪枝啊(qДq )【思路】位运算:时间效率较低(172MS),有些辜负了位运算的初衷。首先将二维数组倒序看作一个二进制数num。我们假设1代表翻转,0代表不翻转,可以发现以下规律:0 xor 1=1,1 ...
阅读全文
摘要:基本上算是普通但略有些繁琐的广搜。给出的墙面和门的坐标为点,而Nemo位于方格中。【思路】首先思考一下如何存储下整个坐标系。我们预先约定,用一个方格的左下角顶点坐标来作为这个方格的坐标。map[i][j][k]数组是一个三维数组,下标前两位表示当前方格坐标为(i,j),第三位依次表示方格的上下左右,...
阅读全文
摘要:今天试了下noi oj的1.1节,随便总结一下。【cout左对齐右对齐的方法】 1 #include 2 #include 3 #include//setw需要的头文件 4 using namespace std; 5 6 int main() 7 { 8 int a=1,b=23,c=45...
阅读全文
摘要:【思路】题目中的“可以沿直线发射打破砖墙”可能会迷惑到很多人,实际上可以等价理解为“通过砖墙的时间为2个单位”,这样题目就迎刃而解了。第一次碰到时可能不能很好把握,第二次基本就可以当作水题了。【错误点】1.不能用裸的bfs。广搜的实际思想是将到达时间最短的放在队首,这样首次到达终点即为时间的最小值。...
阅读全文
摘要:单调队列经典题之一。【思路】设置两个单调队列分别记录最大值和最小值。对于每一个新读入的数字,进行两次操作(对于求最大值和最小值中的某一个而言),一是若队首不在滑窗范围内则删去;二是删去队末比当前值小(或大)的值,并将当前值插入对尾。每一次的最小(大)值就是当前单调队列的队首。【错误点】一定要写whi...
阅读全文
摘要:至今没有找到出处的题目,但是手里碰巧有一套测试数据,缺测试数据的人可以问我要。经典单调队列,这位的博文说的很清楚,我就不多阐述了。 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 const int MA...
阅读全文
摘要:参考:❀ 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int MAXN=2500+50; 7 struct rec 8 { 9 int a,b;10 bool operator ...
阅读全文
摘要:【思路】建立一个小堆和一个大堆。大堆用来存放第1..index-1大的数,其余数存放在大堆,小堆的堆顶元素便是我们要求出的第index大的数。每次插入一个A(n),必须保证大堆中数字数目不变,故先插入小堆中。若此时小堆堆顶小于大堆堆顶,则交换堆顶元素;每次Get(),输出小堆的堆顶元素,并将它并入大...
阅读全文
摘要:思路详见之前的贪心专题,用优先队列来代替之前的插入排序,效率为O(nlogn) 1 #include 2 #include 3 #include 4 using namespace std; 5 const int MAXN=20000+5; 6 int l[MAXN]; 7 8 int main...
阅读全文
摘要:解题方法详见《挑战程序设计竞赛(第二版)》P74-75。注意首先要对加油站以位置为关键字快排,不要遗忘把终点视作一个加油量为0的加油站,否则最终只能到达终点前的加油站。 1 /*优先队列*/ 2 #include 3 #include 4 #include 5 #include 6 using n...
阅读全文
摘要:优先队列能够完成以下操作:♣插入一个数值♣按照某种条件获得数值,并且删除(如最大值,最小值)二叉堆的结构:儿子的值一定不小于父亲的值,数的节点按从上到下,从左到右紧密排列。二叉堆的操作:♣插入:在堆的末位插入该数值,不断向上交换,直至当前位置的父亲节点小于等于该数值♣删除:把堆中的最小值(根的位置)...
阅读全文
摘要:非常经典的划分数问题,即相当于把m个物体分成至多n组,求出分组总数。【思路】当前状态dp[i][j]表示将i个物体分成至多j组的分组总数。对于当前状态,有以下两种情形:(1)j组中有组为空,则这种情况下分组总数相当于将i个物体分成至多j-1组。即dp[i][j-1]。(2)j组中没有组为空,则每一组...
阅读全文
摘要:POJ2533裸的LIS,时间复杂度为O(n^2) 1 #include 2 #include 3 using namespace std; 4 const int MAXN=1000+5; 5 int a[MAXN]; 6 int dp[MAXN]; 7 int n,ans; 8 9 int m...
阅读全文
摘要:深搜部分和之前的POJ2362差不多,只是有几处需要额外的剪枝。【思路】排序后从最短木棒开始搜索至木棒长总和,如果木棒长总和sum能整除当前棒长,则进入深搜。【剪枝】先前POJ2362的剪枝部分不再重提,这里只讲额外的几处(我们称切断后的棒为木棒,切断前的棒为原棒):1.如果所有木棒等长,即排序后s...
阅读全文
摘要:从昨天晚上写到现在,一直在TLE,现在终于剪枝完成了_(:зゝ∠)_【思路】深搜:用这类型组合题目最基本的深搜,变量side记录当成已经组成了几条变,sl表示当前在组合的边已经有的长度。如果当前stick的长度与已有长度的和恰巧等于边长,则side+1,将sl清零;否则若小于边长,则sl+当前长度继...
阅读全文
摘要:整个题库的第二题,原本都没有屑于去做,突发奇想抱着秒杀的心态去写了代码,却硬生生地吃了4个WA..【思路】先去除掉小数点,进行最基本的高精度乘法运算,再在运算得到的结果中添加小数点输出。【前铺】让我们先来看一看数组究竟需要设多大?数据范围是最大为99.999,则近似为100.000,当n=25时,至...
阅读全文
摘要:一、求两个高精度正数的和差积 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int MAXN=1000; 7 char s1[MAXN],s2[MAXN]; 8 int ed1,e...
阅读全文