题目大概意思是:给出n个坐标(i,y[i]),问是否存在两条不重合的平行线,经过所有点,且每条平行线上至少有一个点。
思路为:把所有的点分成两个平行线的集合,则第一个点与第二个点连接的斜率和第一个点和第三个点连接的斜率或第三个点和第二个点连接的斜率必定有一个存在其中一个平行线的集合当中,则不存在两条平行线,经过所有的点。
直接上代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cctype>
using namespace std;
int mj(double k,int n,int *m)
{
int flag=0;
int p=-1;//已第一个点和第P个点为基准枚举进行查找
for(int i=2;i<=n;i++)
{
if(m[i]-m[1]==k*(i-1))continue;
flag=1;
if(p<0)
p=i;
else if(m[i]-m[p]!=k*(i-p))//第p个点和i相连结的斜率与第一条平行线不平行跳出
{
flag=0;
break;
}
}
if(flag)
return 1;
else
return 0;
}
int main()
{
int n;
int a[10005];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
double k1=(a[2]-a[1])/1.0;
double k2=(a[3]-a[1])/2.0;
double k3=(a[3]-a[2])/1.0;
if(mj(k1,n,a)||mj(k2,n,a)||mj(k3,n,a))
//其中一个斜率存在一个平行线集合中,切其他点在另外一个平行线集合当中
printf("Yes\n");
else
printf("No\n");
}