NYOJ 3 多邊形重心問題

2021-08-28 08:12:31 字數 2311 閱讀 3871

題目描述:

在某個多邊形上,取n個點,這n個點順序給出,按照給出順序將相鄰的點用直線連線, (第乙個和最後乙個連線),所有線段不和其他線段相交,但是可以重合,可得到乙個多邊形或一條線段或乙個多邊形和乙個線段的連線後的圖形;

如果是一條線段,我們定義面積為0,重心座標為(0,0).現在求給出的點集組成的圖形的面積和重心橫縱座標的和;

輸入,第一行有乙個整數0**:

#include

#include

const

int n =

10005

;typedef

struct

point;

point point[n]

;inline

double

crossproduct

(int i)

intmain()

area =

fabs

(area)

;//我說了,叉乘有方向,最後記得取絕對值

if(area <

0.0000001

)printf

("0.000 0.000\n");

else

printf

("%.3lf %.3lf\n"

, area,

fabs

(x + y)

/ area);}

}

思路:

求多邊形面積:將n邊形分割為n-2個三角形,分別求三角形面積,又因為已知頂點座標,所以可以根據向量來求,原點到

某頂點的確定的向量就是這個頂點的座標,設頂點為 p1, p2, …, pk, 則面積s

對於重心, 設每個三角形面積為st, 對應向量為(x1, y1), (x2, y2), 那麼x方向:(x1+x2)/3, y方向: (y1+y2)/3,假設總面積為s, 那麼每個三角形權重為st/s, 那麼

重心座標為各個三角形重心乘以其面積求和後除以s,

叉乘/向量積:

向量的叉乘,即求同時垂直兩個向量的向量,即c垂直於a,同時c垂直於b(a與c的夾角為90°,b與c的夾角為90°)

c = a×b = (a.yb.z-b.ya.z , b.xa.z-a.xb.z , a.xb.y-b.xa.y)

叉積的長度|a×b|可以解釋成這兩個叉乘向量a,b共起點時,所構成平行四邊形的面積。

fabs函式:

用法:#include

功能:求浮點數x的絕對值

說明:計算|x|, 當x不為負時返回 x,否則返回 -x

inline內聯函式用法:

內聯函式的基本思想在於將每個函式呼叫以它的**體來替換,很可能會增加整個目標**的體積過分地使用內聯所產生的程式會因為有太大的體積而導致可用空間不夠。即使可以使用虛擬記憶體,內聯造成的**膨脹也可能會導致不合理的頁面排程行為(系統顛簸),這將使你的程式執行慢得象在爬,過多的內聯還會降低指令快取記憶體的命中率,從而使取指令的速度降低,因為從主訪問指令當然比從快取要慢。另一方面,如果內聯函式體非常短,編譯器為這個函式體生成的**就會真的比為函式呼叫生成的**要小許多。如果是這種情況,內聯這個函式將會確實帶來更小的目標**和更高的快取命中率!

在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替換。由於在編譯時將內聯函式體中的**替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間開銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。

◆總結:inline函式是提高執行時間效率,但卻增加了空間開銷。

即inline函式目的是:為了提高函式的執行效率(速度)。

非內聯函式呼叫有棧記憶體建立和釋放的開銷

在c中可以用巨集**提高執行效率,巨集**不是函式但使用起來像函式,編譯器用複製巨集**的方式取代函式呼叫,省去了引數壓棧、生成組合語言的call呼叫、返回引數、執行return等過程,從而提高速度。

const用法:

const修飾的資料型別是指常型別,常型別的變數或物件的值是不能被更新的。

typedef structpoint;用法詳解:

#include

typedef

struct

point;

main()

typedef給一種資料型別乙個別名,可以用別名來引用這種資料型別。

上述,定義了乙個struct型別,他的別名是point。

NYOJ 3 多邊形重心問題

int abs int i 處理int型別的取絕對值 double fabs double i 處理double型別的取絕對值 float fabsf float i 處理float型別的取絕對值 時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述在某個多邊形上,取n個點,這n個...

nyoj 3 多邊形重心問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 在某個多邊形上,取n個點,這n個點順序給出,按照給出順序將相鄰的點用直線連線,第乙個和最後乙個連線 所有線段不和其他線段相交,但是可以重合,可得到乙個多邊形或一條線段或乙個多邊形和乙個線段的連線後的圖形 如果是一條線段,我們定義...

NYOJ 3 多邊形重心

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述在某個多邊形上,取n個點,這n個點順序給出,按照給出順序將相鄰的點用直線連線,第乙個和最後乙個連線 所有線段不和其他線段相交,但是可以重合,可得到乙個多邊形或一條線段或乙個多邊形和乙個線段的連線後的圖形 如果是一條線段,我們定義面...