在二維平面有 n 個紅點和 m 個黑點,已知這些點的座標,這些點不存在三點共線的情況。從這些紅點中任意取出三個點,可以構成 n * ( n - 1 ) * ( n - 2 ) / 6 個三角形,求這些三角形中包含黑點的數量為奇數的三角形的數量。
輸入格式
輸入包含多組測試資料,對於每組測試資料:
第一行包含兩個整數 n m ( 3 ≤ n ≤ 100 ; 0 ≤ m ≤ 1000 ) 。
接下來 n 行每行包含兩個整數,表示 n 個紅點的座標。
接下來 m 行每行包含兩個整數,表示 m 個黑點的座標。
輸入保證所有的座標值的絕對值小於等於 100000 。
輸出格式
對於每組測試資料,輸出 「case c: ans」 ,其中 c 表示測試資料編號, ans 表示包含奇數個黑點的三角形的數量。
樣例輸入
4 5
0 0
10 0
0 10
10 10
1 2
3 4
6 2
9 5
6 7
樣例輸出
case 1: 2
根據題目所說我們將所有的紅色點都將構成三角形並且我們判斷黑色的點是否在三角形內部,然後我們轉化如何判斷點在三角形內部;
根據數學知識叉乘發來判斷點是否在三角形內部
沿著三角形的邊按順時針方向走,判斷該點是否在每條邊的右邊(這可以通過叉乘判斷),如果該點在每條邊的右邊,則在三角形內,否則在三角形外。這個演算法只用到了三次叉乘,沒有除法運算和三角函式、開根號等運算,所以效率很高,而且精度很高(沒有浮點誤差)。
即(x1*y2-x2*y1)
設三角形三點a(x1,y1)b(x2,y2)c(x3,y3),已知點m(x,y)
1,先求出三個向量ma,mb,mc.
2,計算ma x mb,mb x mc,mc x ma (x表叉乘)
3,如果此三組的向量叉乘的結果都是同號的(或都正,或都負),即方向相同的,則說明點m在三角形每條邊的同側,即內部。否則必在外部!
具體示例:
a(0,3) b(0,0) c(3,0)
m(1,1)
ma (1,-2)
mb (1,1)
mc (-2,1)
ma x mb = 3
mb x mc = 3
mc x ma = 3
n(3,3)
na (3,0)
nb (3,3)
nc (0,3)
na x nb = 9
nb x nc = 9
nc x na = -9
根據以上規則可判斷m點在內 n點在外
下面引入**
#include
using
namespace
std;
#define maxn 1000
static
int cc = 0;
int n, m;
struct point //點建立
p[maxn], b[maxn];
bool isinpology(point xx, point yy, point zz, point b)//判斷點是否在內部 x,y,z分別表示三個點,b表示黑色點的資料
//是否具有奇數個黑色的點
bool isod(point x, point y, point z, point b)
if (cnt % 2 == 0)return
false;
return
true;
}int main()
//黑色的點 m
for (int i = 0; icin >> b[i].x >> b[i].y;
}//取三個點
int nump = n, cnt = 0;
for (int i = 0; i < n - 2; i++)}}
cout
<< "case "
<<++cc<<": "
<< cnt << endl;
return
0;}
計蒜客 2019計蒜之道D
題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...
計蒜客 解碼
蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...
計蒜客 郊遊
蒜頭君成為了計蒜客附屬幼兒園的一名老師,乙個陽光明媚的週末,蒜頭君帶領著小朋友們去野外郊遊。一共有 2n2n 個小朋友,正好是 n n 個男孩和 n n 個女孩。蒜頭君讓小朋友分組玩遊戲,每組乙個男孩和乙個女孩,但是有些女孩比較討厭某些男孩,不願意和他們分在一組,男孩覺得和誰分在一組都無所謂。你能告...