題意:平面上給出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...