题目描述
一天,小明坐在院子里数星星,Gardon就出了个难题给他,让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小明马上就看花了眼,你能写个程序来帮他计算么?
输入
首先输入一个整数N(N<=300),接下来的N对数每对表示一个星星的位置(星星的坐标在-10000到10000之间,精确到小数点后1位)。没有两个星星会在同一个位置。
输出
一个整数,表示一条直线上最多星星的数目。
样例输入 Copy
5 0 0 1 0 1 1 0 1 0.5 0.5
样例输出 Copy
3
问题分析
星星个数已知,给所有星星一个编号从0—n-1 ,假设所有星星都不在其他星星的连线上这是最多有几条线呢,以0号星星为中心可以与1号2号......n-1号形成n-1条线,以1号星星为中心可以与2号三号......n-1号(注,以一号为中心时已经与二号形成一条线了)形成n-2条线以此类推,可得300颗星星最多形成45000条线,我们定义一个这么长的数组来储存每一条线上的星星数量,以任意两颗星星为中心看看其他星星是否在这条线上如果在则让星星数目加一,在判断星星是否在两颗星的连线上看看这一颗星与其中一颗星连线的斜率是否等于那两颗星连线的斜率即可。
代码实现
- #include
- struct point{
- double x;
- double y;
- };
- int main(){
- int n;
- int x[45000]={0};
- scanf("%d",&n);
- struct point s[300];
- for(int i=0;i
- scanf("%lf %lf",&s[i].x,&s[i].y);
- }
- int m=0;
- int max=0;
- for(int i=0;i
-1;i++){ - for(int j=i+1;j
- for(int k=0;k
- if(k!=i&&k!=j&&(s[i].y-s[j].y)/(s[i].x-s[j].x)==(s[i].y-s[k].y)/(s[i].x-s[k].x)){
- x[m]++;
- }
- }
- x[m]+=2;
- if(max
- max=x[m];
- }
- m++;
- }
- }
- printf("%d",max);
- return 0;
- }
提交结果

-
相关阅读:
老绅士才懂的Wallpaper免费使用方法3.0
Vue3-小兔鲜项目
hdu 3549 Flow Problem(最大流 EK,sap)
Bean装配相关注解使用说明
【冰糖R语言】实现贝叶斯优化 rBayesianOptimization
Python中关于类属性、类方法和静态方法的【综合案例】— 设计一个Game类
RayFire破碎基础
Netty系列教程 Netty组件之EventLoopGroup
基于麻雀搜索算法的PID神经网络解耦控制算法研究附Matlab代码
unity 使用声网(Agora)实现语音通话
-
原文地址:https://blog.csdn.net/apprentice_eye/article/details/127763920