——————————————————————————————————
题目描述
新年到了,突然间,就在那美丽的一霎那,你好友和你(K个人)的周围满是礼物,你发扬你帅气的风格,让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等(精确到小数后四位,所有运算均为去尾),这些礼物就都属于这个人]。现在你们所在的位置是原点(0,0),每个礼物的位置用坐标表示。现在告诉你每个礼物的坐标,还有每个礼物是谁送的。要你找出你的礼物离你多远,你能拿到多少礼物,这些礼物是谁送的。如果你拿不到礼物,请输出“555…”
——————————————————————————————————
输入输出格式
输入格式:
第一行:N 和 K 分别表示礼物的个数和人数。
第二到N+1行:每行先是赠送礼品人的姓名,然后是礼物的坐标(x,y)。
数据间空格分割
输出格式:
第一行: D 和 U 表示礼物距你多远(只要去尾后的整数)和你能拿到多少礼物。
第二到U+1行:每行一个人名,表示送礼的人。<按照输入的顺序输出>
——————————————————————————————————
输入输出样例
sample 1
输入样例1:
5 2
Jason 1 1
Herry 4 4
Patty 3 4
Tom 2 10
Peter 5 10
输出样例1:
5 1
Patty
sample 2
输入样例2:
6 2
Jim 1 -1
Flord 3 -3
Joseph -1 1
Steve 3 3
Tiger 2 -10
User 10 20
输出样例2:
4 2
Flord
Steve
——————————————————————————————————
——————————————————————————————————
分析
题目简洁易懂,输入,排序,模拟,输出
输入时求出距离(dis),根据dis和姓名进行排序,然后模拟每个人可以拿到的礼物,最后输出可以得到的礼物的距离和数量,并循环输出送礼物的人名
——————————————————————————————————
Code
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
struct liwu
{
string name;
int x,y,xuhao;
long long d;
}w[100000];
void qsort(int left,int right)
{
int i,j,xh;
long long m;
i=left;
j=right;
m=w[(i+j)/2].d;
xh=w[(i+j)/2].xuhao;
do
{
while(w[i].d<m||w[i].d==m&&w[i].xuhao<xh)
i++;
while(w[j].d>m||w[j].d==m&&w[j].xuhao>xh)
j--;
if(i<=j)
{
swap(w[i],w[j]);
i++;
j--;
}
}while(i<=j);
if(j>left)
qsort(left,j);
if(i<right)
qsort(i,right);
}
long long total=0,a[1000],dis;
int main()
{
int i,j,n,k;
cin>>n>>k;
for(i=0;i<n;i++)
{
cin>>w[i].name>>w[i].x>>w[i].y;
w[i].xuhao=i+1;
w[i].d=(sqrt((double)w[i].x*w[i].x+(double)w[i].y*w[i].y))*10000;
}
qsort(0,n-1);
dis=w[0].d;
total=1;
a[0]=0;
for(i=1;i<n;i++)
{
if(w[i].d==w[i-1].d)
a[total++]=i;
else
{
k--;
if(k==0)
break;
a[0]=i;
total=1;
dis=w[i].d;
}
}
if(k>1)
cout<<"555...";
else
{
cout<<dis/10000<<" "<<total<<endl;
for(i=0;i<total;i++)
cout<<w[a[i]].name<<endl;
}
return 0;
}
· 这里我手打了一个快排,实际上用系统自带sort(,,cmp)即可
——————————————————————————————————