兔八哥與獵人(洛谷P1170題題解,Java語言描述)

題目要求

題目鏈接

在這裏插入圖片描述

分析

這題看起來好像不難,但要認真讀題。
他說的什麼間隔爲1只不過是一句廢話,告訴你就是普通的矩陣地圖而已。

其實數據不可能是隻有1行的,2行爲一組,每一組都是獨立的,要考察每一組裏兔八哥能不能被獵人K.O.

那怎麼纔算K.O.呢?問題就轉化爲一張點陣圖中兩個點是否直接相連(中間不穿過其他點),所有的東西就看做物理上的質點(或者就是平面上一個純粹的點)吧。

也就是說,Δy\Delta yΔx\Delta x最小公約數是11

好了,gcdgcd 唄,歐幾里得算法!
《輾轉相除法(歐幾里得算法)詳解》

但這裏如果我們簡單地使用int的歐幾里得算法,會爆的,全部RE,所以可以考慮BigInteger的gcd()。

使用Java寫的這個題基本必定會T掉,因爲太慢了,根據多年與Java博弈的經驗,我成功地在五次提交之內AC,下面說說一些注意的點:

  • 讀一定要用BufferedReader,Scanner可以直接nextBigInteger(),看似更好其實更慢了
  • 一定要一次把所有的數據讀進來,否則肯定會炸,千萬別一邊讀一遍算
  • 結果千萬不能一次一次的輸出,必須使用StringBuilder整合輸出內容
  • 不要使用字符串連接符,怕影響效率
  • split()的時候一定要使用 ,千萬不能使用\\s+,不然估計會T掉
  • 數組別亂開,按照需要的來開,怕MLE

第二個數據點和第十個數據點巨難過,第二個數據點輸入數據4.05MB,輸出數據454.55KB,一共100000組,數據點十更過分。

爲什麼強調一定要注意我說的那些數據細節呢?看下面的AC記錄就行了,就差一點就失敗了:

在這裏插入圖片描述

AC代碼(Java語言描述)

import java.io.*;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) throws IOException {
        StringBuilder result = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(reader.readLine());
        String[] x1_arr = new String[num], y1_arr = new String[num], x2_arr = new String[num], y2_arr = new String[num];
        for (int i = 0; i < num; i++) {
            String[] temp1 = reader.readLine().split(" "), temp2 = reader.readLine().split(" ");
            x1_arr[i] = temp1[0];
            x2_arr[i] = temp2[0];
            y1_arr[i] = temp1[1];
            y2_arr[i] = temp2[1];
        }
        reader.close();
        for (int i = 0; i < num; i++) {
            BigInteger x1 = new BigInteger(x1_arr[i]), y1 = new BigInteger(y1_arr[i]), x2 = new BigInteger(x2_arr[i]),
                    y2 = new BigInteger(y2_arr[i]);
            if ((x2.subtract(x1)).gcd((y2.subtract(y1))).equals(BigInteger.ONE)) {
                result.append("no\n");
            } else {
                result.append("yes\n");
            }
        }
        System.out.print(result);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章