poj1328为什么我狂wa?

sunsnowdrop 2009-07-31 04:57:29
#include<iostream>
#include<cmath>
using namespace std;

struct seg
{
double left , right;
}p[1000];

int n , d , maxr , cnt , c = 1 , x , y;
bool imp;

int myCom ( const void * e1 , const void * e2 )
{
seg * p1 = ( seg * ) e1 ;
seg * p2 = ( seg * ) e2 ;
if ( p1->left != p2->left )
return (p1->left - p2->left)>0?1:-1 ;
else
return (p1->right - p2->right)>0 ? 1:-1;
}

int main()
{
while ( scanf("%d %d" , &n , &d ))
{
if ( n== 0 && d== 0 )
break;

imp = false; //判断是否可能

for ( int i = 0 ; i < n ; ++ i )
{
scanf("%d %d" , &x , &y);
if ( abs(y) > abs(d) )
imp = true;
p[i].left = x - sqrt(double(d*d-y*y));
p[i].right = x + sqrt(double(d*d-y*y));
}

if ( imp )
printf("Case %d: -1\n" , c++);

qsort( p , n , sizeof(seg) , myCom);

cnt = 1 ;
maxr = p[0].right ;

for ( int i = 1 ; i < n ; ++ i )
{
if ( p[i].left > maxr )
{
++ cnt;
maxr = p[i].right ;
}
else if ( p[i].right < maxr )
maxr = p[i].right ;
}

printf("Case %d: %d\n" , c++ , cnt );
}
return 0;
}
...全文
61 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
adfas 2009-07-31
  • 打赏
  • 举报
回复
记得是道贪心
这题靠RP
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunsnowdrop 的帖子:]
#include <iostream>
#include <cmath>
using namespace std;

struct seg
{
double left , right;
}p[1000];

int n , d , maxr , cnt , c = 1 , x , y;
bool imp;

int myCom ( const void * e1 , const void * e2 )
{
seg * p1 = ( seg * ) e1 ;
seg * p2 = ( seg * ) e2 ;
if ( p1->left != p2->left )
return (p1->left - p2->left)>0?1:-1 ;
else
return (p1->right - p2->right)>0 ? 1:-1;
}

int main()
{
while ( scanf("%d %d" , &n , &d ))
{
if ( n== 0 && d== 0 )
break;

imp = false; //判断是否可能

for ( int i = 0 ; i < n ; ++ i )
{
scanf("%d %d" , &x , &y);

if ( abs(y) > abs(d) ) //漏了一种情况,如果d<0时也可以是impossible,但你没有能cover住
imp = true;
p[i].left = x - sqrt(double(d*d-y*y));
p[i].right = x + sqrt(double(d*d-y*y));
}

if ( imp )
printf("Case %d: -1\n" , c++);

qsort( p , n , sizeof(seg) , myCom);

cnt = 1 ;
maxr = p[0].right ;

for ( int i = 1 ; i < n ; ++ i )
{
if ( p[i].left > maxr )
{
++ cnt;
maxr = p[i].right ;
}
else if ( p[i].right < maxr )
maxr = p[i].right ;
}

printf("Case %d: %d\n" , c++ , cnt );
}
return 0;
}[/Quote]

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧