/*

题意:给出n,m。

n表示给出的n个横坐标为1-n,y为0的坐标m表示以下有m个坐标,在横坐标上的点

向各个角度看,在可以看到最多的点在同一条直线上的点的做多值为横坐标这一点的值,最后各个

横坐标的值的和为多少

思路:由于m的值为枚举随意的两个点连成的直线,看在直线上的点有多少,看这条线和横坐标的值为

多少。是否是整值点。假设是就记录这个整值点的最大值

*/

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e6 +5;

const double eps =1e-3;

int b[maxn];

struct Point

{

    double x,y;

    Point(double x=0,double y=0):x(x),y(y) {}

};

typedef Point Vector;

Vector operator - (Point A,Point B)

{

    return Vector(A.x-B.x,A.y-B.y);

}

Vector operator +(Vector A,Vector B)

{

    return Vector(A.x+B.x,A.y+B.y);

}

Vector operator * (Vector A,double p)

{

    return Vector(A.x*p,A.y*p);

}

double Cross(Vector A,Vector B)

{

    return A.x*B.y-A.y*B.x;

}

int dcmp(double x)

{

    if(fabs(x)<eps)  return 0;

    return x>eps?

1:-1;

}

struct Line

{

    Point p;

    Vector v;

};

int GetLineIntersection(Line L1,Line L2)

{

    if(dcmp(Cross(L1.v,L2.v))==0)

        return 0;

    Vector u=L1.p-L2.p;

    int t=Cross(L2.v,u)/Cross(L1.v,L2.v);

    Point answer;

    answer=L1.p+L1.v*t;

    int temp=(int)(answer.x+0.5);

    if(dcmp(answer.x)>0&&dcmp(answer.x-temp)==0&&dcmp(answer.y)==0&&temp<=1000000)

        return temp;

    return 0;

}

int main()

{

    int n,m;

    Point a[300];

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        memset(b,0,sizeof(b));

        for(int i=0; i<m; i++)

            scanf("%lf%lf",&a[i].x,&a[i].y);

        Line ox;

        ox.p.x=0;

        ox.p.y=0;

        ox.v.x=1;

        ox.v.y=0;

        Line l1;

        for(int i=0; i<m; i++)

        {

            for(int j=i+1; j<m; j++)

            {

                int have=2;

                for(int k=j+1; k<m; k++)

                {

                    if(dcmp(Cross(a[i]-a[j],a[k]-a[j]))==0)

                        have++;

                }

                l1.p=a[i];

                l1.v=a[i]-a[j];

                int flag=GetLineIntersection(ox,l1);

                if(flag)

                {

                    a[299].x=flag;

                    a[299].y=0;

                    if(dcmp(Cross(a[i]-a[j],a[299]-a[j]))==0)

                    b[flag]=max(b[flag],have);

                }

            }

        }

        int sum=0;

        for(int i=1; i<=n; i++)

            if(b[i])

                sum+=b[i];

            else

                sum++;

        cout << sum << endl;

    }

    return 0;

}

codeforces 183B - Zoo的更多相关文章

  1. Codeforces Round #250 (Div. 1) B. The Child and Zoo 并查集

    B. The Child and Zoo Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/438/ ...

  2. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  3. Codeforces 437D The Child and Zoo - 树分治 - 贪心 - 并查集 - 最大生成树

    Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The ...

  4. Codeforces Round #359 (Div. 2) B. Little Robber Girl's Zoo 水题

    B. Little Robber Girl's Zoo 题目连接: http://www.codeforces.com/contest/686/problem/B Description Little ...

  5. Codeforces 437D The Child and Zoo(并查集)

    Codeforces 437D The Child and Zoo 题目大意: 有一张连通图,每个点有对应的值.定义从p点走向q点的其中一条路径的花费为途径点的最小值.定义f(p,q)为从点p走向点q ...

  6. Codeforces Round#250 D. The Child and Zoo(并差集)

    题目链接:http://codeforces.com/problemset/problem/437/D 思路:并差集应用,先对所有的边从大到小排序,然后枚举边的时候,如果某条边的两个顶点不在同一个集合 ...

  7. Codeforces 437 D. The Child and Zoo 并查集

    题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么 ...

  8. Codeforces D - The Child and Zoo

    D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联 ...

  9. Codeforces Round #250 (Div. 2) D. The Child and Zoo 并查集

    D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI

    一.扫码 扫描的控件是一个view,使用者只需贴在自己的控制器内即可.其他UI用户可在自己控制器随便添加.代码如下 - (void)viewDidLoad { [super viewDidLoad]; ...

  2. ntp流量放大攻击分析

    最近,听说挂在网络上的设备进行时间同步成功率低,YS需要架设自己的NTP服务器,这玩意第一时间能让人想到NTP流量放大攻击,这也是一种比较古老的攻击方式,检测了一下发现所使用的OS默认已经进行了加固, ...

  3. lync项目总结

    概述 9月份,由于公司人事变动,摆在自己面前也有两条路可选择,一是选择lync,二是选择sharepoint,由于之前,部门老大已经让我看了大概一个月的有关lync方面的资料(文档,代码,项目实施等) ...

  4. xargs: How To Control and Use Command Line Arguments

    参考: http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/ http://linux ...

  5. spring+mybatis项目启动报错Initializing Spring root WebApplicationContext

    这个问题很怪异,各种各样的情况都会导致这个问题的出现,主要是由于sping加载读取配置文件的时候出了问题.我在处理mybatis的时候出现了这个问题,后来排查发现,在mybatis的配置文件中如果有大 ...

  6. http://www.oschina.net/question/1019034_153316

    http://www.oschina.net/question/1019034_153316 http://www.oschina.net/question/97503_212116?sort=tim ...

  7. 多个客户端连接socket

    import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import ...

  8. 实现一个JDK代理demo

    JDK代理,非常简单地实现了动态代理(首先是实现对应的InvocationHandler:然后,以接口来为被调用目标构建代理对象,代理对象简介运行调用目标,并提供额外逻辑插入) 缺点:它是只能以接口为 ...

  9. Jacoco覆盖率工具使用之maven篇

    说明 之前的文章已经介绍过如何使用apacheant 执行jacoco工具,下面开始介绍如何使用maven使用jacoco工具. 1.首先新建一个maven项目       如图所示:        ...

  10. nmap小技巧[1] 探测大网络空间中的存活主机

    url: nmap是所有安全爱好者应该熟练掌握的扫描工具,本篇介绍其在扫描大网络空间时的用法. 为什么要扫描大网络空间呢? 有这样的情形: 内网渗透   攻击者单点突破,进入内网后,需进一步扩大成果, ...