/*

题意:给出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. 对mysql数据库表的相关操作

    虫师博客(Python使用MySQL数据库(新)): https://www.cnblogs.com/fnng/p/3565912.html 1.更改表的结构,增加一个字段放置新增的属性 alter ...

  2. [BZOJ3894]文理分科(最小割)

    (1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...

  3. [Atcoder Regular Contest 062] Tutorial

    Link: ARC 062 传送门 C: 每次判断增加a/b哪个合法即可 并不用判断两个都合法时哪个更优,因为此时两者答案必定相同 #include <bits/stdc++.h> usi ...

  4. [CF441E]Valera and Number

    题意:给定$x,k,p$和一份伪代码,伪代码大致是循环$k$次,每次有$p\%$的概率把$x$乘$2$,有$(100-p)\%$的概率把$x$加$1$,问最后在二进制下$x$的末尾期望$0$个数 鸽了 ...

  5. 【权值分块】bzoj3685 普通van Emde Boas树

    权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...

  6. Python的hashlib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...

  7. Linux查看系统开机时间(转)

    1.who命令查看 who -b查看最后一次系统启动的时间. who -r查看当前系统运行时间 2.last  reboot last reboot可以看到Linux系统历史启动的时间. 重启一下操作 ...

  8. javascript的rsa加密和python的rsa解密

    先说下目前测试情况:javascript加密后的数据,python无法完成解密,我估计是两者的加密解密方法不同 1.看了这篇文章:http://blog.nsfocus.net/python-js-e ...

  9. ubuntu ufw防火墙简易教程(转)

    ufw是一个主机端的iptables类防火墙配置工具,比较容易上手.一般桌面应用使用ufw已经可以满足要求了. 安装方法 sudo apt-get install ufw 当然,这是有图形界面的(比较 ...

  10. solr copyfield字段使用实践

    1.使用场景 比如我们现在有一个文档,有title.author.area.keyword.link等字段.现在要把这个文档索引到 solr中,为了方便对author.area.keyword进行搜索 ...