1082 射擊比賽 (20 分)
本題目給出的射擊比賽的規則非常簡單,誰打的彈洞距離靶心最近,誰就是冠軍;誰差得最遠,誰就是菜鳥,本題給出一系列彈洞的平面坐標(x,y),請你撰寫程式找出冠軍和菜鳥,我們假設靶心在原點(0,0),
輸入格式:
輸入在第一行中給出一個正整數 N(≤ 10 000),隨后 N 行,每行按下列格式給出:
ID x y
其中 ID 是運動員的編號(由 4 位數字組成);x 和 y 是其打出的彈洞的平面坐標(x,y),均為整數,且 0 ≤ |x|, |y| ≤ 100,題目保證每個運動員的編號不重復,且每人只打 1 槍,
輸出格式:
輸出冠軍和菜鳥的編號,中間空 1 格,題目保證他們是唯一的,
輸入樣例:
3
0001 5 7
1020 -1 3
0233 0 -1
結尾無空行
輸出樣例:
0233 0001
結尾無空行
解題思路:
Tips:原點與點(x , y)之間的距離可以這樣計算:sqrt( x * x + y * y)
對于vector陣列nums
最大值: *max_element(nums.begin(),nums.end())
最小值: *min_element(nums.begin(),nums.end())
正常思路(對于本題正常思路行不通,可忽略本段):
此時,相信你一定會想到把輸入的 id 當成陣列的下標,把 x * x + y * y 的值作為相應下標的值,然后得出陣列的最值,回圈陣列并找到與最值對應的下標并輸出即可,
但這種方法在這種題上是不可行的,因為這樣的話你必須初始化陣列的值:
①初始化為0,本題中 x * x + y * y 的最小值是可以為 0 的,那么此時陣列的下標可能并沒有回圈到 id 就已經有被陣列的其他下標給代替了,答案極有可能錯誤
②初始化為負數,那么最小值就為負數,而 x * x + y * y 的值是不可能為負數的,對應下標就永遠不可能是輸入的 id
正確思路:
我們應該利用結構體來進行升序排序,排序好以后直接輸出結構體陣列的第 0 位和最后一位的 id
代碼示例:
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
using namespace std;
struct st
{
string id;
int x, y;
};
bool Sort(st s1, st s2) //對結構體升序排序
{
return (s1.x * s1.x + s1.y * s1.y) < (s2.x * s2.x + s2.y * s2.y);
}
int main()
{
int n;
cin >> n;
vector<st> ans; //創建結構體陣列
for (int i = 0; i < n; i++)
{
st temp;
cin >> temp.id >> temp.x >> temp.y;
ans.push_back(temp);
}
sort(ans.begin(), ans.end(), Sort); //排序
//直接輸出結構體陣列的第 0 位和最后一位的 id
cout << ans[0].id << " " << ans[ans.size() - 1].id << endl;
}
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294145.html
標籤:其他
