PAT乙級——1082(排序 or 比較)java實現
阿新 • • 發佈:2018-12-08
文章目錄
題目:射擊比賽 (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
題目分析及實現
首先說一下,有一個超時。
題目很簡單,圓形公式 R2 = X2 + Y2,R2 即為彈孔到圓心的距離。
只需要比較R的大小即可。
思路一
本題實現了兩種思路,第一種是定義一個類,自己定義排序。使用TreeSet方式在加入的同時自動排序。但是最後一個用例超時,大膽猜想就是因為參加對比資料太多了。
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
Set <Sportor>set = new TreeSet<>();
for(int i=0;i<num;i++) {
Sportor sportor = new Sportor(in.next(), in.nextInt(), in.nextInt ());
set.add(sportor);
}
int time=0;
for (Sportor sportor : set) {
if(time==0)
System.out.print(sportor.ID);
time++;
if(time==set.size())
System.out.print(" "+sportor.ID);
}
}
}
class Sportor implements Comparable<Sportor> {
String ID;
int x;
int y;
int Radius;
public Sportor(String id, int x, int y) {
this.x = x;
this.y = y;
this.ID = id;
Radius =(int)(Math.pow(x, 2)+Math.pow(y, 2));
}
@Override
public int compareTo(Sportor o) {
return this.Radius-o.Radius;
}
}
思路二
第二個思路是直接對比,儲存最遠的和最近的
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt();
int max = 20000;//判斷得分最高,距離最近,從最遠向最近逼近
int min = 0;//判斷得分最低,距離最遠,從最小向最遠放大
String maxid = "";
String minid = "";
for (int i = 0; i < num; i++) {
String id = in.next();
int x = in.nextInt();
int y = in.nextInt();
int radius = (int) (Math.pow(x, 2) + Math.pow(y, 2));
if (radius < max) {
max = radius;
maxid = id;
}
if (radius > min) {
min = radius;
minid = id;
}
}
System.out.print(maxid + " " + minid);
}
}
emmmmm,結果還是超時,問題並沒有解決,只好大膽的猜想是java的問題。