题目链接:http://codeforces.com/problemset/problem/849/B
题意:给定n个点,每个点坐标(i,yi),求是否存在两条平行线使得所有的点都在这两条平行线上。
题解:两条平行线斜率都是k,我们可以先确定两条平行线的两个基点(最左边的那个点),然后再枚举是不是斜率都是k。
根据鸽巢原理,前三个点肯定能够确定这条斜率,这样能够求出三个斜率,然后检查这三个斜率是否有符合条件的,有的话就可以了。
这个想法是别人那里看过来的,是真的厉害!(Orz Orz Orz....
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n,y[1111]; 5 bool check(double k){ 6 int point=-1; 7 int flag=0; 8 for(int i=2;i<=n;i++){ 9 if(y[i]-y[1]==k*(i-1)) continue;//第一个基点 10 flag=1; 11 if(point<0) point=i;//第二个基点,两条平行线 12 if(y[i]-y[point]!=k*(i-point)){ 13 flag=0;break; 14 } 15 } 16 if(flag) return true; 17 else return false; 18 } 19 20 int main(){ 21 cin>>n; 22 for(int i=1;i<=n;i++) cin>>y[i]; 23 double k1=1.0*(y[2]-y[1]); 24 double k2=0.5*(y[3]-y[1]); 25 double k3=1.0*(y[3]-y[2]); 26 if(check(k1)||check(k2)||check(k3)) cout<<"Yes"<<endl; 27 else cout<<"No"<<endl; 28 return 0; 29 }
时间: 2024-12-20 11:21:15