1022: Watchdog
题目大致意思:有 一个边长为S(2 <= S <= 40)的正方形格子,里面有H个仓库(1 <= H <= 50)每个仓库都有自己的坐标并且仓库不会重叠,问是否在格子中存在一个点使得以该点为圆心能覆盖到所有仓库并且该圆不能出界。如果有多个圆心输出序号最小的点。如果该点不存在则输出"poodle"
因为题目数据量小可以从小到大枚举每个点是否满足条件,当有个点满足条件时,该点就是答案了。
枚举每个点的时候更新一下该点距离他最远的仓库的距离l,判断以l为半径的圆是否不会出界,判断边界就是该点的坐标加上半径有没有超出正方形的边界。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct point{ //用结构体储存仓库的坐标
int x;
int y;
}h[50];
int map[41][41]; //储存每个格子
int H;
double l(int x,int y,int hx,int hy){ //求出两点之间的距离
return 1.0*sqrt((x-hx)*(x-hx)+(y-hy)*(y-hy));
}
double findmax(int x,int y){ //遍历每个仓库寻找距离最远的
double nmax=-1;
for(int i=0;i<H;i++){
nmax=max(nmax,l(x,y,h[i].x,h[i].y));
}
return nmax;
}
int main(int argc, char const *argv[])
{
int N;
scanf("%d",&N);
while(N--){
int f=1;
memset(map,0,sizeof(map));
int S;
scanf("%d %d",&S,&H);
for(int i=0;i<H;i++){
scanf("%d %d",&h[i].x,&h[i].y);
map[h[i].x][h[i].y]=1; //将有仓库的地方视为不可选区域
}
for(int x=0;x<=S;x++){ //从小枚举每个点第一个求出来的点就是答案
for(int y=0;y<=S;y++){
if(!map[x][y]){ //如果该点没有仓库
double m=findmax(x,y); //求出最长距离
if(x>=m&&y>=m&&(x+m)<=S&&(y+m)<=S){ //判断边界条件
f=0;
printf("%d %d\n",x,y);
break;
}
}
}
if(!f)break;
}
if(f)printf("poodle\n");
}
return 0;
}
这题没什么难度,就是理解题目能力差点,浪费了时间。