
高效算法设计
文章平均质量分 78
incredible_bly
这个作者很懒,什么都没留下…
展开
-
高效算法设计专项:UVa 10125
暴力枚举显然会TLE。Lrj书里介绍了中途相遇法,用map实现了一下,就是先用O(n^2)建立一个a+b到一个整数的映射,然后再用O(n^2)枚举d-c就可以在O(n^2)复杂度下解决该问题了。需要注意的是a、b、c、d不能重复,这里我用map>实现以判重。只不过具体代码比较丑…… #include #include #include #include #include #includ原创 2013-04-04 22:53:20 · 644 阅读 · 0 评论 -
高效算法设计专项:LA 4356
刚开始一直以为O(n^2)过不了,后来发现原来还挺快的。就是枚举扇形的周长,然后扫一遍,找出以该周长覆盖k个点所需的最小角度,更新最小值即可。 #include #include #include #include using namespace std; const double eps=1e-6; const double pi=acos(-1.0); const int maxn=原创 2013-07-08 23:50:55 · 732 阅读 · 0 评论 -
高效算法设计专项:LA 2963
刚开始完全没思路,看了训练指南上的提示说是扫描法,然后往这方面想。仔细分析题目发现可以用O(n^2)的时间解决。不难发现可能的结果只可能是n个点两两距离的,然后可以从小到大扫描这n*(n-1)/2条边,然后维护当前符合条件的planet的个数。需要注意处理边长相等的情况。 #include #include #include #include using namespace std; #原创 2013-06-02 12:31:07 · 820 阅读 · 0 评论 -
高效算法设计专项:UVa 11572
题目大意就是求一串数中最长的子串,要求该子串中的数互不相同。这题扫一遍就可以了,可以一边读入一边做。用一个map映射距当前位置的值为i的最近的位置j,同时记录一个pre,表示从pre到当前位置没有相同元素。然后在读入的同时维护map和pre,同时更新最长的不含相同元素的子串即可。 #include #include #include #include using namespace st原创 2013-05-15 21:28:28 · 579 阅读 · 0 评论 -
高效算法设计专项:LA 4726
这是一道斜率优化的题目。在《浅谈数形结合思想在信息学竞赛中的应用》中有较为详细的解释,对于细节的实现还是没有完全体会,只能说是似懂非懂。这里我就不班门弄斧了,还是去仔细研究那篇论文吧。 #include #include using namespace std; #define M 100010 int n,l; char d[M]; int q[M],s[M]; int main() {原创 2013-05-20 21:25:20 · 763 阅读 · 0 评论 -
高效算法设计专项:UVa 11054
很简单的扫描线,可以一边输入一边计算。想法也比较简单,所有wine都是卖到最近的地点,所以从左到右扫一般,记录一个当前剩余值,然后每输入一次,累加一次剩余值的绝对值,然后更新剩余值即可。 #include #include #include #include using namespace std; typedef long long LL; #define M 100010 LL a[原创 2013-05-04 22:25:18 · 510 阅读 · 0 评论 -
高效算法设计专项:UVa 10827
这道题用O(n^4)的方法水过了……就是把原来n*n的矩阵扩展成2n*2n的矩阵,然后预处理出以(i,j)为右下角的矩阵的元素和。然后再枚举矩阵的左上角和右下角,当矩阵的长或宽大于n时,直接continue即可。 #include #include #include #include using namespace std; #define M 78 const int inf=1<<3原创 2013-05-16 22:44:52 · 532 阅读 · 0 评论 -
高效算法设计专项:LA 2689
注意到W、H很大,所以不可能用扫描法。注意到n很小,所以可以用点将矩形切割,然后枚举所有矩形即可。具体实现我也是看了题解才知道怎么做…… #include #include #include #include using namespace std; struct rec { int x,y; int w,h; } r[1000000]; int main() {原创 2013-05-01 21:47:12 · 578 阅读 · 0 评论 -
高效算法设计专项:UVa 10535
暴力枚举从起始点引一条到墙的一个端点的射线所穿过的墙的总数即可。复杂度为O(n^2)。 #include #include #include #include using namespace std; #define M 510 const double eps=1e-8; int dcmp(double x) { if(fabs(x)<eps) return 0; el原创 2013-05-01 21:46:07 · 456 阅读 · 0 评论 -
高效算法设计专项:UVa 10730
注意到输入为一个全排列,所以可以标记每个数的位置,而非每个位置上的数,然后枚举所有可能构成等差数列的数,通过位置关系判断即可。 #include #include using namespace std; #define M 10010 char c; int n,a[M],t; void solve() { for(int i=0;i<n;i++) for(int原创 2013-04-30 21:54:01 · 642 阅读 · 0 评论 -
高效算法设计专项:UVa 10810
就是求序列的逆序数,用入门经典上用归并排序求逆序数即可。需要注意结果用int会爆,所以得用longlong。 #include #include using namespace std; #define M 500010 typedef long long LL; LL a[M],t[M],cnt; int n; void merge_sort(LL *a,int x,int y,LL *t原创 2013-04-28 21:01:53 · 540 阅读 · 0 评论 -
高效算法设计专项:UVa 10391
用hash表记录字符串,然后遍历所有的字符串,检验该字符串是否可以被分解成两个表中的其他的字符串即可。具体实现起来就是用stl中的set。 #include #include #include #include #include #include using namespace std; int main() { freopen("in.txt","r",stdin);原创 2013-04-05 22:09:10 · 500 阅读 · 0 评论 -
高效算法设计专项:UVa 10691
这道题可以转化为区间选点问题,即给定一些区间,找到最少的点使得每个区间至少存在一个点。只不过这道题上的区间是在一个圆上的,注意到n小于200,可以枚举开始的区间,然后分别进行一次贪心即可,时间复杂度为O(n^2)。只不过由于是在圆上,所以有很多细节需要注意,WA了n炮才调过了。 #include #include #include #include #include using nam原创 2013-07-09 23:47:46 · 531 阅读 · 0 评论