題目簡述:
圖上n個點,有黑色和白色。選一條直線,統(tǒng)計直線一端的黑點數(shù)和另一端的白點數(shù)之和,求這個數(shù)的最大值。
題目分析:很巧妙的解法,可以確定兩個點連接一條直線,選其中一個點為基準(zhǔn)點,做其余點相對于他的坐標(biāo),還有這個點的極角(atan2)
#include <bits/stdc .h>using namespace std;const int maxn=1e3 10;int n;struct node{ int x,y,f; double rad; bool operator <(const node &p)const { return rad<p.rad; }}a[maxn],b[maxn];bool judge(node a,node b){ return a.x*b.y-a.y*b.x>=0;}int solve(){ int ans=0; if(n<=3)return n; for(int i=0;i<n; i) { int p=0; for(int j=0;j<n; j) { if(i==j)continue; b[p].x=a[j].x-a[i].x; b[p].y=a[j].y-a[i].y; if(a[j].f==1) { b[p].x=-b[p].x; b[p].y=-b[p].y; } b[p].rad=atan2(b[p].y,b[p].x); p ; } sort(b,b p); int l=0,r=0,cnt=2;//這兩段while不是很理解 while(l<p) { if(l==r){r=(r 1)%p;cnt ;} while(r!=l&&judge(b[l],b[r])) { r=(r 1)%p; cnt ; } cnt--; l ; ans=max(ans,cnt); } } return ans;}int main(){ //freopen("in.txt","r",stdin); while(scanf("%d",&n)&&n) { for(int i=0;i<n; i) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].f); } printf("%d\n",solve() ); }}
聯(lián)系客服