找礼物(find)
题目描述
新年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等(精确到小数点后四位,所有运算均为去尾),这些礼物就都属于这个人]。现在你们所在的位置是原点(0,0),每个礼物的位置用坐标表示。现在告诉你每个礼物的坐标,还有每个礼物是谁送的。要你找出你的礼物离你多远,你能拿到多少礼物,这些礼物是谁送的。如果你拿不到礼物,请输出“555…”。
输入
第1行:N和K分别表示礼物的个数和人数(K≤N≤100000);
第2到N+1行:每行先是赠送礼品人的姓名,然后是礼物的坐标(x,y)(坐标绝对值小于106)。数据间用空格分开。
输出
第1行:D和U表示礼物距你多远(只要去尾后的整数)和你能拿到多少礼物。
第2到U+1行:每行一个人名,表示送礼的人(按照输入的顺序输出)。
样例输入
5 2
Jason 1 1
Herry 4 4
Patty 3 4
Tom 2 10
Petter 5 10
样例输出
5 1
Patty
分析:求距离时注意算到long long即可,set用来去重,最后按序输出答案即可;
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <ext/rope>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e5+;
const int dis[][]={{,},{-,},{,-},{,}};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
int n,m;
pair<ll,string>a[maxn],b[maxn];
set<ll>q;
vector<string>pp;
int main()
{
int i,j,k,t;
cin>>n>>m;
rep(i,,n-)
{
string p;
ll x,y,r;
cin>>p>>x>>y;
r=(ll)(sqrt(1.0*x*x+y*y)*);
a[i]=mp(r,p);
b[i]=a[i];
q.insert(r);
}
sort(a,a+n);
if(q.size()<m)puts("555...");
else
{
int now=;
ll ans;
for(ll x:q){now++;if(now==m){ans=x;break;}}
rep(i,,n-)
{
if(ans==b[i].fi)pp.pb(b[i].se);
}
cout<<ans/<<" "<<pp.size()<<endl;
for(string x:pp)cout<<x<<endl;
}
//system ("pause");
return ;
}