Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
题意:
二维平面上若干个点,能否用两条直线,穿过所有的点
前3个点要么在同一直线上,要么在2条直线上
所以用前3个点里的任意两个点定好第一条直线
然后判断剩余所有的点是否在这条直线或另一条直线上
#include<cstdio> using namespace std; #define N 100001 int n,x[N],y[N]; bool solve(int a,int b,int c) { long long x0=x[b]-x[a],y0=y[b]-y[a],x1,y1,x2,y2; bool tag=false; for(int i=1;i<=n;++i) { if(i==c || i==b || i==a) continue; x1=x[i]-x[a]; y1=y[i]-y[a]; if(x0*y1-x1*y0) if(!tag) { x2=x[c]-x[i]; y2=y[c]-y[i]; tag=true; } else { x1=x[c]-x[i]; y1=y[c]-y[i]; if(x1*y2-x2*y1) return false; } } return true; } int main() { // freopen("bigsuccess3.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",&x[i],&y[i]); if(n<=4) { printf("success"); return 0; } int a,b,c=3; long long x0=x[1]-x[2],y0=y[1]-y[2],xx,yy; for(int i=3;i<=n;++i) { xx=x[i]-x[1]; yy=y[i]-y[1]; if(x0*yy-xx*y0) { c=i; break; } } a=1; b=2; if(solve(a,b,c) || solve(b,c,a) || solve(c,a,b)) printf("success"); else printf("failure"); return 0; }