分治
FightingForFinal
这个作者很懒,什么都没留下…
展开
-
快速排序(分治法O(nlogn))
划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于等于右边的任意元素。 递归求解:把左右两部分分别排序。 合并问题:不用合并,因为此时数组已经完全有序。void qsort(int L,int R){ if(L>=R)return; int l=L,r=R; int key=a[l];//取a[l]为关键字 while(l<r){原创 2016-03-15 19:35:42 · 781 阅读 · 0 评论 -
HDU2199二分法求根
HDU2199Can you solve this equation? y=8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6单调递增,所以直接二分法#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;double y;原创 2015-10-31 18:15:35 · 428 阅读 · 0 评论 -
POJ2456 二分搜索
POJ2456 Aggressive cows 题意:有N间牛舍,牛舍被排在一条线上,第i号牛舍在xi的位置。但是他的M头牛对小屋很不满意,因此经产互相攻击。为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽量远的牛舍。也就是要最大化最近的两头牛之间的距离。 关于最小值最大化或者最大值最小化的问题,通常用二分搜索法。#include<cstdio>#include<algorithm>原创 2015-09-17 15:39:42 · 360 阅读 · 0 评论 -
最大连续和(分治法)O(nlogn)
分解:将序列分解成元素个数尽量相等的子序列,求出每个子序列的最大连续和 合并:合并子问题得到原问题的解,由于最大连续和的子序列要么完全在中点左边,要么完全在中点右边,要么就是横跨左右两边,所以比较这几种情况就可得出当前序列的最大连续和int maxsum(int l,int r){ if(l==r)return a[l]; int m=(l+r)/2; int Max=ma原创 2016-03-14 19:38:36 · 2341 阅读 · 0 评论 -
归并排序
归并排序采用分治思想 使用了拆分及合并将两个有序的序列合并算法如下void merge(){ int i=1,j=1,k=1; while(i<=n&&j<=m){ if(a[i]<=b[j])c[k++]=a[i++]; else c[k++]=b[j++]; } while(i<=n)c[k++]=a[i++]; whil原创 2016-02-28 15:19:33 · 341 阅读 · 0 评论