1. 程式人生 > >Hdoj 1785.You Are All Excellent 題解

Hdoj 1785.You Are All Excellent 題解

Problem Description

本次集訓隊共有30多人蔘加,毫無疑問,你們都是很優秀的,但是由於參賽名額有限,只能選拔部分隊員參加省賽。從學校的角度,總是希望選拔出最優秀的18人組成6支隊伍來代表學校。但是,大家也知道,要想做到完全客觀,是一件很難的事情。因為選拔的標準本身就很難統一。
為了解決這個難題,我現在把問題作了簡化,現在假設每個隊員都是二維平面中的一個點,用(xi,yi)座標來表示,一個隊員的能力可以用他到原點的歐幾里德距離來表示。由於這種排名標準太~客觀了,新隊員很難有出頭的機會,很多人很是鬱悶。特別是一個廢話不是很多、不是特別暴躁、號稱蓋帽高手的偽**就很有意見,他現在要求改革排名規則,並且自己提出了一套號稱絕對公正的方案:
現在不是用一個點來表示一個隊員了,而是用原點到該隊員所在的點所構成的向量來表示一個隊員。如果該向量和X正軸夾角比較小的話,就說他的能力比較高,排名就應該靠前。
這就是著名的“偽氏規則”(說實話,這規則我有點懷疑其客觀性,因為我知道他的座標是(3.1,0.1)...)

Input

輸入資料包含多組測試例項,每個例項的第一行是一個整數n(n<=100),表示集訓隊員的人數,緊接著的一行是2*n個數,表示n個隊員的座標值(x1,y1,x2,y2...xn,yn),n為負數的時候表示輸入資料的結束。
特別說明,所有的y座標均為正數,並且所有的座標值都是有一位小數的浮點數。

Output

對於每個測試例項,請在一行內輸出排名後的座標,座標之間用一個空格隔開。特別地,你可以假設根據“偽氏排名規則”結果唯一。

Sample Input

3
5.0 4.0 3.1 0.1 2.0 2.0
-1

Sample Output

3.1 0.1 5.0 4.0 2.0 2.0

Author

lcy

Source

2007省賽集訓隊練習賽(10)_以此感謝DOOMIII


思路

與夾角有關的很容易想到斜率\(k\),查了下有\(atan2(y,x)\)\(atan(y/x)\)兩個函式

這裡用的是\(atan2(y,x)\),返回的直接是與\(x\)軸的夾角,然後sort排序一下即可

程式碼

#include<bits/stdc++.h>
using namespace std;
const double PI = 3.1415926;
struct point
{
    double x,y;
    double angle;
}a[110];
int main()
{
    int n ;
    while(cin>>n)
    {
        if(n<0) break;
        for(int i=1;i<=n;i++)
        {
            cin >> a[i].x >> a[i].y;
            a[i].angle = atan2(a[i].y,a[i].x);
        }
        sort(a+1,a+n+1,[](point a,point b)->bool{return a.angle < b.angle;});
        for(int i=1;i<=n;i++)
            i == n ? printf("%.1lf %.1lf",a[i].x,a[i].y) : printf("%.1lf %.1lf ",a[i].x,a[i].y);
        cout << endl; 
    } 
    return 0;
}