码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 849B Tell Your World (数学题)

时间:2017-09-02 12:12:03      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:==   ace   数学题   turn   point   nbsp   bool   check   set   

题目链接: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 }

 

Codeforces 849B Tell Your World (数学题)

标签:==   ace   数学题   turn   point   nbsp   bool   check   set   

原文地址:http://www.cnblogs.com/Leonard-/p/7466177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!