您的位置:首页 > 理论基础 > 计算机网络

2015亚洲区北京站网络赛

2015-10-26 13:07 429 查看
A http://hihocoder.com/problemset/problem/1227

题意:给出平面上m个点,任选一个点为圆心,选最小的半径使得恰好n个点在圆内。

解法:枚举圆心,然后对所有点到该圆心距离排序,取第n大的距离作为半径,若第n+1大的在圆内或圆上不合法。

//#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-10;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+10;
double x;
double y[M];
bool zero(double x){
return (x>0?x:-x)<eps;
}
void init(){
double add=0.25;
y[0]=0;
for(int i=1;i<30;i++){
y[i]=y[i-1]+add;
add*=0.5;
}
}
int solve(){
int res=0;
for(int i=0;i<30;i++){
if(zero(x-y[i])) return -1;
if(x<y[i]) return res;
res+=4;
}
return 2000;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
init();
int t;
while(~scanf("%d",&t)){
while(t--){
scanf("%lf",&x);
printf("%d\n",solve());
}
}
return 0;
}


View Code

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: