uva 1606 思維 極座標掃瞄線)

2021-08-14 23:59:56 字數 1365 閱讀 3029

題意:平面上給出n個點,分為黑白兩種顏色,問在其中給出乙個隔板,使隔板左邊+隔板右邊的棋子數量最大(左右隔板棋子顏色不同、隔板上的棋子算任意一邊)

寒假的第一題,屯了很久沒做,自己的思維還是不夠做這個題。

列舉每乙個點,當做基準點,算出相對座標,再算出乙個極座標角,用來排序,基準點即可看作是(0,0)再列舉點a與基準點p的直線l1,b與基準點p的直線l2,叉積判斷是否在一側,若超過180以後,將a++,繼續列舉下乙個b,動態維護。

還有個技巧是將白關於基準點翻轉180即是黑。

#include 

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1e5 + 5;

struct node

}node[maxn],pt[maxn];

bool cmp(node p, node q)

int cross(node a, node c)

int main(int argc, const

char * argv)

if(n <= 3)

for(int i=0; iint cnt = 0;

for(int j=0; jif(i == j) continue;

pt[cnt].x = node[j].x - node[i].x;

pt[cnt].y = node[j].y - node[i].y;

if(node[j].c == 1)

pt[cnt].rad = atan2(pt[cnt].y,pt[cnt].x);

cnt++;

}sort(pt, pt+cnt, cmp);//基準點不在裡面 基準點可以看作是0,0

int l = 0, r = 1, sum = 2;

while(l < cnt)

while(r != l && cross(pt[r], pt[l]))

ans = max(ans,sum);

sum--;

l++;}}

cout

<< ans << endl;

}}/*

30 0 0

0 1 0

2 2 1

40 0 0

0 4 0

4 0 0

1 2 1

7-1 0 0

1 2 1

2 3 0

2 1 1

0 3 1

1 4 0

-1 2 0

0 */

例題8 6 兩性親分子 UVa 1606

分析 每次列舉乙個點作為基準點,然後求其他點與這個基準點的夾角,再排一遍序,按照角度從小到大排序,接下來以基準點和其中乙個點的連線開始逆時針掃瞄一遍,直到基準點和另乙個點的連線和開始的那條線之間的角度大於等於180停止,這樣就可以了,我也看了好一會兒題解才看懂,具體看 include include...

演算法競賽入門經典UVa1606 兩親性分子

題目 題目大意 平面上有n n 1000 n le 1000 n 1000 個點,每個點為白點或者黑點。現在需要放置一條隔板,使得隔板一側的白點數加上另一側的黑點數總數最大。隔板上的點可以看作是任意一側。這個題的思路是先列舉基準點a,再以基準點a為原點,算出其他點相對基準點的位置,以基準點為原點建立...

UVA10905 思維考察

1 uva10905 思維 2題目大意 3給定n個正整數,你的任務是把它們練成乙個最大的數 4思考 5這道題目應該是在考察歸納的思維吧 6我一開始的思路是將兩個字串按位比較,當位數有剩餘時,再分類討論大小。7但是這樣寫,細節上很容易出錯.8但是,如果換一種方法,忽略細節,直接連成s1 s2和s2 s...