随笔分类 -  ACM——分治 + 递归

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4768思路:解题关键是奇数+偶数=奇数,然后我们就是枚举奇数位置(奇数为就一个或者0个),然后计算左边的和是否为奇数,如果是奇数,那么该点就存在与左边,否则存在于右边#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define CL(arr, val) memset(arr, val... 阅读全文
posted @ 2013-09-30 10:59 E_star 阅读(268) 评论(0) 推荐(0) 编辑
摘要:http://codeforces.ru/contest/231/problem/C题意:给你n个数,你每次可以使其中的一个数加1,最多的加1次数为k,可以选择同一个数连续加但必须小于k。求使得小于等于k次加1操作后原序列中出现的相同元素最多的元素的个数,以及这个元素的值。思路:比赛时想了O(n^2)的做法写了一下超时,这是必然,我们首先对其进行从小到达排序然后枚举位置i ,从i - 1到1 枚举查看加到a[i]需要加1的次数直到k剩余个数不满足。这样的O(n^2)显然超时。要怎么优化呢? 开始想了二分枚举到底枚举什么自己糊涂了,没想到。这里看对于个数枚举。当我们枚举到 i 时,在区间[1,i 阅读全文
posted @ 2012-10-28 10:01 E_star 阅读(190) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4268题意:Alice and Bob各自都有N个矩形纸牌,Alice 想用他的纸牌尽量多的覆盖Bob的纸牌,i覆盖j满足的条件是p[i].h >= p[j].h p[i].w >= p[j].w ,并且一张纸牌只能覆盖一张,求最多覆盖的张数。思路:这里给出的n很大,(N <= 100,000) 首先分析肯定回事O(nlogn)级别的算法,才开始我想到的是二分,分别将Alice and Bob的纸牌排序,枚举Alice的纸牌二分查找Bob的纸牌里最大的能满足被Alice 的纸牌覆盖的然后覆盖 阅读全文
posted @ 2012-09-15 09:49 E_star 阅读(198) 评论(0) 推荐(0) 编辑
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4282题解:http://www.cnblogs.com/E-star/archive/2012/09/11/2680992.htmlView Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <set 阅读全文
posted @ 2012-09-11 23:15 E_star 阅读(335) 评论(0) 推荐(0) 编辑
摘要:zoj 3366http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366第一次接触三分,二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸性函数时,二分法就无法适用,这时三分法就可以“大显身手”~~此题题意:给出灯泡的高度H,人的高度h,以及灯泡与墙之间的距离求人形成影子的最大长度;思路:这里人的影子的长度分地上与墙上两块,首先当灯,人的头部和墙角成一条直线时(假设此时人站在A点),此时的长度是影子全在地上的最长长度,当人再向右走时,影子开始投影到墙上,当人贴着墙,影子长度即为人的高度。所以当人从A 阅读全文
posted @ 2012-08-09 20:28 E_star 阅读(286) 评论(0) 推荐(0) 编辑
摘要:怎么说呢,只能说自己还不够熟练,能力还不够,细心成都还不够吧。这样的二分题目在POJ的训练计划里面有类似的题目,自己也是都刷了,可是在调这道题目的时候废了老大的尽了,比赛结束后听polla的一句<t才属于同一类,才知道自己怎么犯了这么二逼的错误呢!唉。。。。自己给弄成>t了。改过后终于出来了。思路:找出最大的t,如果按t分类,可分出1组,按0分类分出n组,二分枚举t然后利用并查集判断分出多少种类。#include <cstdio>#include <cstring>#include <iostream>#define maxn 1007using 阅读全文
posted @ 2012-06-03 12:50 E_star 阅读(207) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3273http://poj.org/problem?id=32583273:题意就是John计算了他接下来的n天里每天将要花的钱数,他想将这些天划分成连续的m段,求出这m段中最大花费。以保证他在每一段时间里都不会缺钱花:思路:将这n天分成一段的话,最大钱数就是其所有钱数的和,如果分成n段的话就是这些钱数里面最大值,然后二分枚举钱数,如果枚举的钱数将这n个数分成大于m段的话,就说明二分枚举的钱数小了,l = mid + 1,否则 r = mid - 1;最后输出l就可以了。。。#include <iostream>#include 阅读全文
posted @ 2012-05-19 16:49 E_star 阅读(362) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=2299归并虽然知道了过程但是敲起代码来还是出现各种小错误。。。唉,,,View Code #include <cstdio>#include <iostream>#define maxn 500007using namespace std;int a[maxn];int n;int tmp[maxn];__int64 ct;void merge(int s,int m,int e){ int i = s,j = m + 1; int k = 0; while (i <= m && j <= 阅读全文
posted @ 2012-03-23 20:56 E_star 阅读(190) 评论(0) 推荐(0) 编辑
摘要:http://poj.org/problem?id=3295首先分别将p,q,r,s,t的值饭分别枚举出来,然后运用递归将问题不到缩小,并判断是否为永真式。View Code #include <iostream>#include <cstdio>#include <cstring>#define maxn 107using namespace std;char str[maxn];int flag[10];int start;int juage(){ int p,q; switch(str[++start]) { case 'K': p = 阅读全文
posted @ 2012-02-25 19:29 E_star 阅读(244) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示