zoukankan      html  css  js  c++  java
  • hdu 4007 Dave

    经典的统计题目

    题意:

    给出N个人的坐标,求出在以r为边的正方形中最多的人数

    分析:

    因为正方形的位置并未固定,而要满足覆盖最多的点,则以某一个点的y坐标作为下边界一定有最优解,所有:

    首先对N个人的纵坐标进行排序,枚举所有Y坐标(正方形下边界),找出满足以当前y坐标为下边界的正方形内的点,再枚举满足条件的点X坐标,计算以r为边最多可覆盖的点,总复杂度O(n^2)

    代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node
    {
    	int x,y;
    }p[1001];
    int n,ans,r,xx[1001],yy[1001];
    int main()
    {
    	while(scanf("%d %d",&n,&r)==2)
    	{
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d %d",&p[i].x,&p[i].y);
    			yy[i]=p[i].y;
    		}
    		sort(yy+1,yy+1+n);
    		ans=0;
    		for(int j=1;j<=n;j++)//枚举下边界
    		{
    			int cnt=0;
    			for(int i=1;i<=n;i++)
    				if(p[i].y>=yy[j]&&p[i].y<=yy[j]+r)
    					xx[cnt++]=p[i].x;//找出所有满足当前下边界的点
    			sort(xx,xx+cnt);
    			xx[cnt]=INT_MAX;//用来退出while循环
    			int e=0;
    			for(int i=0;i<cnt;i++)//求出以当前点位左边界的,边长为r的边,最多可覆盖的点
    			{
    				while(xx[e]<=xx[i]+r) e++;
    				ans=max(ans,e-i);
    			}
    		}
    		printf("%d\n",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    创建大顶堆
    大顶堆的实现
    二叉树的前序,中序,后序,层序实现
    链表实现多项式相加
    225. Implement Stack using Queues
    232. Implement Queue using Stacks
    JavaScript 实现队列操作
    Vue 路由守卫
    回文数 & {}[]() 符号判断

  • 原文地址:https://www.cnblogs.com/nanke/p/2168612.html
Copyright © 2011-2022 走看看