题意大概是x轴上方是海洋,海洋上分布着一些岛屿(用点坐标表示),你呢想在岸上安装雷达,使得雷达能扫到岛屿(即在雷达的范围内),求安装雷达的最小数量^-^
Poj-1328
#include<cstdio>
#include<algorithm>
#include<cmath>
const int INF = 1000000000;
using namespace std;
struct Interval { //interval是区间的意思
double left, right;
};
const int max_island = 1000 + 10;
Interval the_interval[max_island];
int the_num;
double the_r;
bool cmp(const Interval& a, const Interval& b) { //排序函数
if (a.right == b.right)
return a.left >= b.left;
return a.right < b.right;
}
int main() {
int the_case = 1;
while (scanf("%d%lf", &the_num, &the_r) == 2) {
if (the_num == 0 && the_r == 0)
break;
double point_x, point_y;
bool if_out_r = false;
for (int i = 0; i < the_num; i++) {
scanf("%lf%lf", &point_x, &point_y);
if (point_y > the_r) {//如果离海岸太远,超出雷达半径,我劝你还是放弃吧
if_out_r = true;
}
else {
the_interval[i].left = point_x - sqrt(pow(the_r, 2) - pow(point_y, 2));
the_interval[i].right = point_x + sqrt(pow(the_r, 2) - pow(point_y, 2));
}
}
if (if_out_r) {
printf("Case %d: -1\n", the_case++);
}
else {
sort(the_interval, the_interval + the_num, cmp);
double most_left = -INF; //double 我写成int找了很久,最大允许的左边区间点
int the_need_radar = 0;
for (int i = 0; i < the_num; i++) {
if (the_interval[i].left > most_left) {
most_left = the_interval[i].right;
the_need_radar++;
}
}
printf("Case %d: %d\n", the_case++, the_need_radar);
}
}
return 0;
}
总结:
1.防止思路错误——我先前以为是像平移法一样把圆往右移,依次计算,导致我花了很长一段时间来写
2.审题要仔细,特别是那些对变量的描述的词汇,特别注意如数据类型,范围,输出格式······
3.编程时先写主函数,把框架先写好,遇到阻碍,在写细节。