Codeforces Round #242 (Div. 2) B. Megacity

http:、、codeforces.com/contest/424/problem/B
B. Megacity
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

The administration of the Tomsk Region firmly believes that it's time to become a megacity (that is, get population of one million). Instead of improving the demographic situation, they decided to achieve its goal by expanding the boundaries of the city.

The city of Tomsk can be represented as point on the plane with coordinates (00). The city is surrounded with n other locations, the i-th one has coordinates (xiyi) with the population of ki people. You can widen the city boundaries to a circle of radius r. In such case all locations inside the circle and on its border are included into the city.

Your goal is to write a program that will determine the minimum radius r, to which is necessary to expand the boundaries of Tomsk, so that it becomes a megacity.

Input

The first line of the input contains two integers n and s (1 ≤ n ≤ 1031 ≤ s < 106) — the number of locatons around Tomsk city and the population of the city. Then n lines follow. The i-th line contains three integers — the xi and yi coordinate values of the i-th location and the number ki of people in it (1 ≤ ki < 106). Each coordinate is an integer and doesn't exceed 104 in its absolute value.

It is guaranteed that no two locations are at the same point and no location is at point (0; 0).

Output

In the output, print "-1" (without the quotes), if Tomsk won't be able to become a megacity. Otherwise, in the first line print a single real number — the minimum radius of the circle that the city needs to expand to in order to become a megacity.

The answer is considered correct if the absolute or relative error don't exceed 10 - 6.

Sample test(s)
input
4 999998
1 1 1
2 2 1
3 3 1
2 -2 1
output
2.8284271
input
4 999998
1 1 2
2 2 1
3 3 1
2 -2 1
output
1.4142136
input
2 1
1 1 999997
2 2 1
output
-1

第一次写解题报告。- -!

这道题的大概意思就是从(0,0)点开始扩张,包括的点的人数和自己本来的人数的总和大于或者等于1000000,就可以成为megacity,否则的话就输出-1。

在输入的时候就把所有的人口加起来,然后判断是不是大于等于1000000,是的话就可以,否则的话就输出-1;

简单的方法就是在输入的时候把每个点距离远点的长度计算出来,然后用qsort排序,qsort可以自己写比较函数,可以排序自己写的结构体,虽然用着比sort麻烦一点,但是比较自由。

还有一个地方就是:计算距离的时候,可以先不要开方,就直接存x²+y²,然后在写compare函数的时候,就比较简单。开始的时候我就先开方,然后就错了好多次…………

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
//按到原点的距离排序(这个地方的排序可以先不开方,就用平方排序,然后在最后输出的时候才开方,否则的话误差会很大)
struct city
{
	int x;
	int y;
	int a;
	double r;
};
int comp(const void *a,const void *b)
{
	return (*(city*)a).r - (*(city*)b).r;
	//return  ((*(city*)a).r - (*(city*)b).r) * 10000000;
}
int main()
{
	int n;
	city a[1000];
	int isbig;
	int sum;
	scanf("%d%d",&n,&sum);
	isbig = sum;
	double max = 0;
	int i;
	for(i=0;i<n;i++)
	{
		scanf("%d%d%d",&a[i].x ,&a[i].y,&a[i].a);
		isbig = isbig + a[i].a;
		a[i].r = a[i].x * a[i].x + a[i].y * a[i].y;//输入的时候就将到原点的距离的平方记录下来,暂时不用先开方
	}
	if(isbig>=1000000)
	{
		qsort(a,n,sizeof(city),comp);
		for(i=0;i<n && sum<1000000;i++)
		{
			sum = sum + a[i].a;
			max = sqrt(a[i].r);
		}
		printf("%.7lf\n",max);
	}
	else
	{
		printf("-1\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值