关于两种写法和评测结果
  • 板块P1153 点和线
  • 楼主STUDENT00
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/12/11 15:53
  • 上次更新2023/10/24 07:58:54
查看原帖
关于两种写法和评测结果
658786
STUDENT00楼主2022/12/11 15:53

1.用斜率式+解方程:

#include<bits/stdc++.h>
#define y1 _y
#define N 15
using namespace std;
int n,p[N];
double x[N],y[N],x1[N],y1[N],x2[N],y2[N]; 
void make(double x1,double y1,double x2,double y2,double &k,double &b){
	k=(y1-y2)/(x1-x2);
	b=y1-k*x1;
}
bool check(){
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++){
			double k1,b1,k2,b2;
			make(x1[j],y1[j],x2[j],y2[j],k1,b1);
			make(x1[i],y1[i],x2[i],y2[i],k2,b2);
			if(k1==k2) continue;
			double x=(b2-b1)/(k1-k2);
			if(x>min(x1[j],x2[j])&&x<max(x1[j],x2[j])&&x>min(x1[i],x2[i])&&x<max(x1[i],x2[i])) return 0;
		}
	}
	return 1;
}
int main(){
	while(~scanf("%lf%lf",&x[n+1],&y[n+1])) n++;
	for(int i=1;i<=n;i++) p[i]=i;
	int ans=0;
	do{
		for(int i=1;i<=n;i++){x1[i]=x[p[i]];y1[i]=y[p[i]];x2[i]=x[p[i+1]];y2[i]=y[p[i+1]];}
		x2[n]=x[p[1]];y2[n]=y[p[1]];
		if(check()) ans++;
	}while(next_permutation(p+1,p+n+1));
	printf("%d",ans/n/2);
	return 0;
}

评测结果:样例没过,25分

2.用向量交叉乘:

#include<bits/stdc++.h>
#define y1 _y
#define N 15
using namespace std;
int n,p[N],x[N],y[N],x1[N],y1[N],x2[N],y2[N]; 
int pro(int x1,int y1,int x2,int y2){
	return x1*y2-y1*x2;
}
bool checkk(int xa,int ya,int xb,int yb,int xc,int yc,int xd,int yd){
	return pro(xb-xa,yb-ya,xc-xa,yc-ya)*pro(xb-xa,yb-ya,xd-xa,yd-ya)<0&&pro(xd-xc,yd-yc,xc-xa,yc-ya)*pro(xd-xc,yd-yc,xc-xb,yc-yb)<0;
}
bool check(){
    for(int i=1;i<n;i++){
        for(int j=i+1;j<=n;j++){
            if(checkk(x1[i],y1[i],x2[i],y2[i],x1[j],y1[j],x2[j],y2[j])) return 0;
        }
    }
    return 1;
}
int main(){
    while(~scanf("%d%d",&x[n+1],&y[n+1])) n++;
    for(int i=1;i<=n;i++) p[i]=i;
    int ans=0;
    do{
        for(int i=1;i<=n;i++){x1[i]=x[p[i]];y1[i]=y[p[i]];x2[i]=x[p[i+1]];y2[i]=y[p[i+1]];}
        x2[n]=x[p[1]];y2[n]=y[p[1]];
        if(check()) ans++;
    }while(next_permutation(p+1,p+n+1));
    printf("%d",ans/n/2);
    return 0;
}

评测结果:100

2022/12/11 15:53
加载中...