http://codeforces.com/problemset/problem/424/B
给n,s
给n个城市,以及里面人口
坐标中心0,0 有s人,
现在扩宽以0,0为中心,半径为r 圈一个圈,使得圈内人口大于等于1e6,求最小的r
直接二分R,每次判断够不够1e6
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
__int64 min(__int64 a,__int64 b)
{return a<b?a:b;}
__int64 max(__int64 a,__int64 b)
{return a>b?a:b;}
__int64 n;
struct node
{
__int64 x,y,z;
double dis;
};
node tm[1005];
__int64 need=0;
__int64 bin(double x)
{
__int64 sum=0;
__int64 i;
for (i=1;i<=n;i++)
{
if (tm[i].dis<=x)
sum+=tm[i].z;
else
break;
if (sum>=need) return 1;
}
return 0;
}
bool cmp(node a,node b)
{return a.dis<b.dis;}
int main()
{
__int64 i,j;
__int64 s;
scanf("%I64d%I64d",&n,&s);
for (i=1;i<=n;i++)
{
scanf("%I64d%I64d%I64d",&tm[i].x,&tm[i].y ,&tm[i].z);
tm[i].dis=tm[i].x*tm[i].x+tm[i].y*tm[i].y;
}
sort(tm+1,tm+1+n,cmp);
need=1000000-s;
double l=0;
double r=1e10;
double ans=-1;
while(fabs(r-l)>eps)
{
double mid=(l+r)/2;
if (bin(mid))
r=mid,ans=mid;
else
l=mid;
}
if (ans==-1) printf("-1\n");
else
printf("%.6lf\n",sqrt(ans));
return 0;
}