洛谷的月赛第二题:
偷上网
Alice 和 Bob 生活在一个 l \times ll×l 的正方形房子里,由于 Bob 最近沉迷隔膜,Alice 决定要限制 Bob 上网的频率。
Alice 建造了 nn 个无线信号屏蔽器,第 ii 个位于 (x_i, y_i)(xi,yi) ,屏蔽范围为 \frac{l}{n}nl 。
Bob 网瘾发作按捺不住上网的冲动,找到了你,帮他找到一个位置 (x, y)(x,y) ,使得没有被 Alice 的无线信号屏蔽器覆盖。
第一行两个整数 n, l(1 \leq n \leq 10, 1 \leq l \leq 10^5)n,l(1≤n≤10,1≤l≤105) ,分别表示无线信号屏蔽器的个数和房子的大小。
接下来 nn 行,每行 22 个数,分别是 x_i, y_i(0 \leq x_i, y_i \leq l)xi,yi(0≤xi,yi≤l) ,意义如上所述。
输出格式:如果可以找到,输出两个数 x, y(0 \leq x, y \leq l)x,y(0≤x,y≤l) ,意义如上所述,如果有多组解,输出任意一组即可。如果你输出的解满足到任意一个屏蔽器的距离都不小于 \frac{l}{n} + 10^{-6}nl+10−6 ,则视为正确。
否则输出 "GG"。
最开始的懵逼了半天,然后想用随机数的方法做,但是由于rand给出的是整数,我怎么弄都弄不好范围,所以最后放弃了
听到题解的时候竟然真的是一个随机算法,于是兴致勃勃的想了想。emm
才知道原来rand有一个最大值是rand_max,我用随机到的数x/rand_max * 范围l,就行了,当前随机到的占总共的比例乘范围就是我想要的数啦。这道题数据貌似比较水。几千次就过了
主要收获就是对rand的使用吧。
对于整数来说随机[x,y] rand()%(y-x+1)+x;
小数就是[0,range] ((double)rand()/RAND_MAX)*range
最后的话就是上码
#include
#include
#include
#include
#define delta 1e-6
using namespace std;
int n,l;
bool ok;
double r;
struct circle
{
double x,y;
}pos[11];
double getdis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool judge(double x,double y)
{
for(int i=1;i<=n;i++)
{
if(getdis(pos[i].x,pos[i].y,x,y)
return true;
}
int main()
{
srand(time(NULL));
cin>>n>>l;
r=l/n;
for(int i=1;i<=n;i++)cin>>pos[i].x>>pos[i].y;
for(int i=1;i<=5000;i++)
{
double nx=((double)rand()/RAND_MAX)*l;
double ny=((double)rand()/RAND_MAX)*l;
if(judge(nx,ny))
{
cout<
}
}
cout<<"GG";
return 0;
}