codeforces 183B - Zoo

/*

题意:给出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;

}

时间: 2024-10-13 01:03:20

codeforces 183B - Zoo的相关文章

CodeForces 686B Little Robber Girl&#39;s Zoo (构造冒泡排序)

题意:给定一排列,让你通过一个区间交换的方式,完成排序. 析:这个题说了,最多不能超过20000次,而 n 最大才100,那么冒泡排序复杂度为 n * n,才10000,肯定是可以的,所以我们就模拟冒泡排序. 代码如下: #include <iostream> #include <cmath> #include <cstdlib> #include <set> #include <cstdio> #include <cstring>

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

题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去参观动物园,动物园分很多个区,每个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.问,平均两个区之间移动的权值为多少. 解题思路:并查集+贪心.将所有的边按照权值排序,从最大的开始连接,每次连接时计算的次数为连接两块的节点数的积(乘法原理). #in

codeforces 686B B. Little Robber Girl&#39;s Zoo(水题)

题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include <iostream> #include <queue> #include <cmath> #include <map> #include <cstring> #include <algorithm> #include <cstdio

CodeForces 686B - Little Robber Girl&#39;s Zoo(暴力)

题意:将一个n(1 <= n <= 100)个元素的序列排成非递减序列,每次操作可以指定区间[ L,R ](区间内元素个数为偶数),将区间内第一项与第二项交换,第三项与第四项交换,第五项与第六项--在2W次内完成排序,输出每次操作. 瞎搞即可,不断检查相邻元素是否满足 前者>=后者,不满足即交换,直到序列满足条件位置(n最大为100绝对不会超过2W步) #include<cstdio> #include<cstring> #include<cctype>

Codeforces Round #250 (Div. 1) B. The Child and Zoo(排序+并查集)(常规好题)

B. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The i-th area contains 

Codeforces 437 D. The Child and Zoo 并查集

题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.如果有多条路的话,要取最大的值作为路径的长度.问,平均两个区之间移动的权值为多少. 题解: 每条边的长度已经知道了,因为路径的权值取这条路中最小的且多条路的话则取较大的,那么我们其实可以从比较大的边开始取(先把边排序),用并查集开始合并

Codeforces 437D The Child and Zoo

这个题还是很好的 有几个套路 先是我们看到题目中让我们处理点权,但是我们发现并不好处理 所以就先化点为边 (套路1) 把每一条边的边权视作边所连接的两个点的\(min\)值 然后我们看到这个题有路径的问题,就先还是要较大的 可以比较显然地想到最大生成树 (套路2) 在\(Kruskal\)中改一下排序方式就行了 然后我们看到不是生成树上的边都我们在考虑走的时候都不会考虑 考虑每一个树边的贡献 连接两个联通块的时候 这一条边会产生\(val[edge]* size[x]* size[y]\)的贡献

Codeforces 437D 贪心+并查集

这个题目让我想起了上次在湘潭赛的那道跪死了的题.也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij就为i到j路上遇到的包括i j在内的最小权值的zoo 然后我就焦头烂额了一下,这个明显就是看某个最小值为最后的结果发挥了多少次作用,但这个是图,要知道某个节点到底给多少条路径贡献出了最小值,还真是有点没头绪(在已知的复杂度一看 最多只能用nlogn的),最后是看了解答才知道的 用并查集来解决某个最小

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多