凸包:用乙個凸多邊形將所有點圍起來,這個凸多邊形就是凸包
1.先要引入乙個數學工具,向量叉積
|c|=|a×b|=|a| |b|sinα(α為a,b向量之間的夾角)
則 |c| 為向量a ,b所組成的平行四邊形的面積
這裡是用叉積判斷兩向量的相對位置關係(非常有用!)
則 a x b < 0 (a在b的逆時針方向 ) , b x a > 0(b在a的順時針方向)
//2. graham掃瞄法求凸包求叉積struct
node;
}}p[n] ,s[n];
inline
double
x( node a ,node b )
1)找出所有點中在最左下角的點定為極點
//2)利用叉積進行極角排序找左下邊界點
int k = 1
; rep( i ,
2,n )
swap( p[
1] ,p[k] );
//極角比較
bool cmp ( node &a , node &b )
//3)存凸包極角排序
sort( p+2 ,p+n+1 ,cmp);
s為存凸包的棧 ,t為棧頂
則由以下關係用叉積取捨s中的點
將凸包存在s中
s[1] = p[1
]; s[
2] = p[2
];
int t = 2
; rep( i ,
3,n )
然後凸包就求出來了
模板題 :
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem( a ,x ) memset( a , x ,sizeof(a) )
#define rep( i ,x ,y ) for( int i = x ; i<=y ;i++ )
#define lson l ,mid ,pos<<1
#define rson mid+1 ,r ,pos<<1|1
#define fi first
#define se second
using
namespace
std;
typedef
long
long
ll ;
typedef pair
pii;
typedef pair
int>pli;
const ll inf = 0x3f3f3f3f
;const
int n = 1e5+5
;const ll mod = 1e9+7
;int
n ,m;
//求叉積
struct
node;
}}p[n] ,s[n];
inline
double
x( node a ,node b )
inline
double
dis( node a ,node b )
inline
double
mul( node a ,node b ,node c )
//極角比較
bool cmp ( node &a , node &b )
//graham 掃瞄
intgraham( )
swap( p[
1] ,p[k] );
//極角排序
sort( p+2 ,p+n+1
,cmp);
//將凸包存在s中
s[1] = p[1
]; s[
2] = p[2
];
int t = 2
; rep( i ,
3,n )
returnt;}
intmain( )
int sz =graham( );
double ans = dis(s[1
] ,s[sz]);
rep( i ,
1 ,sz-1 )ans += dis( s[i] ,s[i+1
] ) ;
printf(
"%.2f
",ans);
return0;
}
10 1動態規劃例題 數字三角形
10.1 什麼是動態規劃 前面學過了用遞迴的方法解決問題。但是,單純的遞迴,在解決某些問題的時候,效率 會很低。例如下面這道題目 例題 數字三角形 問題描述 73 8 8 1 0 2 7 4 4 4 5 2 6 5 上圖給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路 徑,把...
101 二叉樹 對稱二叉樹
方法一 遞迴 對於此題 遞迴的點怎麼找?從拿到題的第一時間開始,思路如下 怎麼判斷一棵樹是不是對稱二叉樹?答案 如果所給根節點,為空,那麼是對稱。如果不為空的話,當他的左子樹與右子樹對稱時,他對稱。那麼怎麼知道左子樹與右子樹對不對稱呢?在這我直接叫為左樹和右樹。答案 如果左樹的左孩子與右樹的右孩子對...
101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。思路 遞迴就用dfs,迭代是b...