/*

题意:给出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. 【Ajax】PHP中ajax的基本知识点

    Ajax常用属性和方法: 属性: readyState: 0(开始创建ajax对象)1(调用open方法)2(调用send方法)3(正在返回数据)4(返回数据结束) responseText/resp ...

  2. 购物平台webApp+服务后台开发

    服务器后台参考:Cloud BaaS 主站地址:http://cloudbaas.sinaapp.com/ 演示地址:http://jeebaas.sinaapp.com/ Mobile UI 框架: ...

  3. 【DFS】Codeforces Round #398 (Div. 2) C. Garland

    设sum是所有灯泡的亮度之和 有两种情况: 一种是存在结点U和V,U是V的祖先,并且U的子树权值和为sum/3*2,且U不是根,且V的子树权值和为sum/3. 另一种是存在结点U和V,他们之间没有祖先 ...

  4. 【pb_ds】bzoj1056 [HAOI2008]排名系统/bzoj1862 [Zjoi2006]GameZ游戏排名系统

    STL裸题,线下AC,bzoj无限RE ing…… #include<cstdio> #include<cctype> #include<iostream> #in ...

  5. 【并查集】bzoj1015 [JSOI2008]星球大战starwar

    倒着处理删点,就变成了加点,于是并查集. #include<cstdio> using namespace std; #define N 400001 int fa[N],kill[N], ...

  6. 十. 图形界面(GUI)设计6.文本框和文本区

    在图形界面中,文本框和文本区是用于信息输入输出的组件. 文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是Action ...

  7. 用fastjson反序列化 带泛型的类

    ServiceResult<User> serviceResult = JSON.parseObject(obtainResult, new TypeReference<Servic ...

  8. 鸟哥的linux私房菜服务器架设篇第五章linux常用网络指令

    ifconfig主要可以手动启动观察修改网络接口的相关参数 ifdown,ifup用来启动和关闭接口,后面直接接接口名称 两部主机两点沟通:ping 两主机之间各节点分析 traceroute 查看本 ...

  9. Java 字符串计算频率出现最高的字符

    public class HighFrequencyWord { public static void findFrequencyWord(String str) {          Collect ...

  10. ngrinder安装

    1.源码编译和部署 官网:http://naver.github.io/ngrinder/ 下载源码后,存在部分依赖库不在maven的远程仓库中,这是可以用下载jar包后,用以下命令打包到本地仓库: ...