Codeforces 849B Tell Your World (数学题)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 849B Tell Your World (数学题)相关的知识,希望对你有一定的参考价值。

题目链接: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 (数学题)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 822C Hacker, pack your bags! - 贪心

github commit时出现 Please tell me who you are.以及项目名称管理

github 提交使用git commit,报错Please tell me who you are

Codeforces Round #422 (Div. 2) C Hacker, pack your bags!

Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序,贪心

CodeForces 822C Hacker, pack your bags!