• BZOJ 1610: [Usaco2008 Feb]Line连线游戏


    1610: [Usaco2008 Feb]Line连线游戏

    Description

    Farmer John最近发明了一个游戏,来考验自命不凡的贝茜。游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i个点 的横、纵坐标分别为X_i和Y_i (-1,000 <= X_i <=1,000; -1,000 <= Y_i <= 1,000)。 贝茜可以选两个点画一条过它们的直线,当且仅当平面上不存在与画出直线 平行的直线。游戏结束时贝茜的得分,就是她画出的直线的总条数。为了在游戏 中胜出,贝茜找到了你,希望你帮她计算一下最大可能得分。

    Input

    * 第1行: 输入1个正整数:N

     * 第2..N+1行: 第i+1行用2个用空格隔开的整数X_i、Y_i,描述了点i的坐标

    Output

    第1行: 输出1个整数,表示贝茜的最大得分,即她能画出的互不平行的直线数

    Sample Input

    4
    -1 1
    -2 0
    0 0
    1 1

    Sample Output

    * 第1行: 输出1个整数,表示贝茜的最大得分,即她能画出的互不平行的直线数

    HINT

     

    4 输出说明: 贝茜能画出以下4种斜率的直线:-1,0,1/3以及1。

    ——我是华丽的分割线——

    题目要求不能平行其实就是线的斜率不同。我们就把每个点两两算出斜率,看看有多少不同的就好了。有一点就是线水平的时候,需要特判一下。【我做的时候数组少打个0、、一不小心就RunTime了好多次、、、

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #define eps 1e-8
    #define inf 1e20
    using namespace std;
    struct PointNode{
    	double  x,y;
    };
    PointNode point[210];
    int n;
    int nume=0;
    
    double sl[40010];
    
    int main(){
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++) scanf("%lf%lf",&point[i].x,&point[i].y);
    	
    	for (int i=1;i<=n;i++){
    		for (int j=i+1;j<=n;j++){
    			if (point[i].x!=point[j].x){
    				sl[++nume]=(point[i].y-point[j].y)/(point[i].x-point[j].x);
    			}else{
    				sl[++nume]=inf;
    			}
    		}
    	}
    	
    	int Ans=0;
    	sort(sl+1,sl+nume+1);
    	for (int i=1;i<=nume;i++){
    		if (fabs(sl[i]-sl[i-1])>eps)  Ans++;
    	}
    	printf("%d
    ",Ans);
    	
    	return 0;
    }




  • 相关阅读:
    读文章论文
    安装并使用SourceMonitor检测代码复杂度
    FindBug安装与使用
    PMD安装与使用
    Checkstyle安装与使用
    文章主题
    GitHub账号
    PICT的安装与使用
    Junit的安装与使用
    SourceMonitor的安装及使用
  • 原文地址:https://www.cnblogs.com/WNJXYK/p/4063954.html
Copyright © 2020-2023  润新知