标签:poj poj1328 poj1328radar install c++ 简单贪心
背景:因为一个小错误找了一个多小时,就是在输入数据的时候,雷达Q的作用范围可以为0.while(scanf("%d %d",&N,&Q)==2&&N)这句话千万不要写成
while(scanf("%d %d",&N,&Q)==2&&N&&Q)
否则就会错。
思路:简单贪心,先要找出每个小岛可以被雷达发现的区间,然后就可以运用贪心算法了,先用sort按照区间左端点升序排列。然后如下运用贪心就可以了
for(int i=1;i<N;i++) { if(radar[i].y<r||radar[i].x==r) r=radar[i].y; if(radar[i].x>r) {m++;r=radar[i].y;} }学习:简单贪心算法的运用,还有sort函数的运用。
sort()函数运用方法:
int cmp(a b,a c) { return b.x<c.x; }
sort(radar,radar+N,cmp);下面附完整代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <cstring> using namespace std; struct a { double x; double y; }island[1100],radar[1100]; int cmp(a b,a c) { return b.x<c.x; } int main(void) { int N,Q,game=1; while(scanf("%d %d",&N,&Q)==2&&N) { int ok=1,m=1; memset(island,0,sizeof(island)); memset(radar,0,sizeof(radar)); for(int i=0;i<N;i++) { cin>>island[i].x>>island[i].y; if(island[i].y>(double)Q||island[i].y<0) ok=0; } if(!ok) {printf("Case %d: %d\n",game++,-1);continue;} for(int i=0;i<N;i++) { radar[i].x=island[i].x-sqrt(Q*Q-island[i].y*island[i].y); radar[i].y=island[i].x+sqrt(Q*Q-island[i].y*island[i].y); } sort(radar,radar+N,cmp); double r=radar[0].y; for(int i=1;i<N;i++) { if(radar[i].y<r||radar[i].x==r) r=radar[i].y; if(radar[i].x>r) {m++;r=radar[i].y;} } printf("Case %d: %d\n",game++,m); } return 0; }
标签:poj poj1328 poj1328radar install c++ 简单贪心
原文地址:http://blog.csdn.net/qiweigo/article/details/43603977