简单题,排序就好了
题目:
You Are All Excellent
为了解决这个难题,我现在把问题作了简化,现在假设每个队员都是二维平面中的一个点,用(xi,yi)坐标来表示,一个队员的能力可以用他到原点的欧几里德距离来表示。由于这种排名标准太~客观了,新队员很难有出头的机会,很多人很是郁闷。特别是一个废话不是很多、不是特别暴躁、号称盖帽高手的伪**就很有意见,他现在要求改革排名规则,并且自己提出了一套号称绝对公正的方案:
现在不是用一个点来表示一个队员了,而是用原点到该队员所在的点所构成的向量来表示一个队员。如果该向量和X正轴夹角比较小的话,就说他的能力比较高,排名就应该靠前。
这就是著名的“伪氏规则”(说实话,这规则我有点怀疑其客观性,因为我知道他的坐标是(3.1,0.1)...)
特别说明,所有的y坐标均为正数,并且所有的坐标值都是有一位小数的浮点数。
#include<iostream>
#include<algorithm>
#include<cmath>
#define pi 3.1415926535
using namespace std;
typedef struct
{
double x, y, k;
}Node;
Node node[101];
bool cmp(Node a, Node b) //排序时的比较函数
{
return a.k < b.k;
}
int main()
{
int n, i, j;
while(scanf("%d", &n) && n >= 0)
{
for(i = 0; i < n; i ++)
{
scanf("%lf %lf", &node[i].x, &node[i].y);
if(node[i].x == 0)
node[i].k = pi / 2;
else if(node[i].x > 0)
node[i].k = atan(node[i].y / node[i].x);
else
node[i].k = pi + atan(node[i].y / node[i].x);
}
sort(node, node + n, cmp);
if(n > 0)
printf("%.1lf %.1lf", node[0].x, node[0].y);
for(i = 1; i < n; i ++)
{
printf(" %.1lf %.1lf", node[i].x, node[i].y);
}
printf("\n");
}
return 0;
}