posts - 7, comments - 13, trackbacks - 0, articles - 37
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

[导入]PKU1328(排序加贪心)

Posted on 2008-10-16 15:15 岁月流逝 阅读(184) 评论(0)  编辑 收藏 引用
算法:
1 排序 算出每个岛可安雷达的最左边坐标和最右边坐标 左座标按升序排列 左相同时右按照降序排列
2 贪心选取 更新最右边的坐标 如果下一个的左座标大于当前最右边 数目加一 否则的话更新最右边的值
排序的时候因为是DOUBLE 所以那个qsort还要小小的注意下写法
PS:还有d可能是负数!
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
struct Point
{
  double left;
  double right;
};
Point a[10000];
int cmp(const void *p1, const void *p2)
{
   Point c1 = *(Point *)p1;
   Point c2 = *(Point *)p2;
   double temp = c1.left - c2.left;
   if (temp > 0.0) return 1;
   else if (temp < 0.0) return -1;
   else {
     temp = c2.right - c1.right;
     if (temp > 0.0) return 1;
     else return -1;
   }
}
int main()
{
  int n;
  int i,j;
  int cnt = 1;
  double x,y,r,d;
  double tmp ;
  double dd;
  int flag ;
  while(scanf("%d%lf",&n,&d)!=EOF)
  {
    flag = 0;
    if(n==0&&d==0)
      break;
        dd=d*d;
    for(i = 0;i<n;i++)
    {
      scanf("%lf%lf",&x,&y);
      r =sqrt(1.0*(dd- y*y));
      a[i].left = x-r;
      a[i].right= x+r;
      if(d<y)
      {
        flag = 1;
      }
    }
  if(flag)
  {
      printf("Case %d: %d\n",cnt++,-1);
      continue;
  }
  qsort(a,n,sizeof(a[0]),cmp);
  int count = 1;
  tmp = a[0].right;
  for(i = 1;i<n;i++)
  {
    if(tmp < a[i].left)
    {
      count++;
      tmp = a[i].right;
    }
    else
    {
      if(tmp>a[i].right)
      tmp = a[i].right;
    }
  }
  printf("Case %d: %d\n",cnt,count);
  cnt++;
  }
  return 0;
}


Tags - , , ,
文章来源:http://www.feng5166.com/blog/read.php?118

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理