1. 程式人生 > >2017今日頭條網招線上程式設計題(部分)

2017今日頭條網招線上程式設計題(部分)

第一題

P 為 給 定 的 二 維 平 面 整 數 點 集 。 定 義 P 中 某 點 如 果 × 滿 足 P 中 任 意 點 都 不 在 × 的 右 上 方 區 域 內 ( 橫 縱 座標 都 大 於 × ) , 則 稱 其 為 “ 最 大 的 ” 。 求 出 所 有 “ 最 大 的 ” 點 的 集 合 。 〈 所 有 點 的 橫 坐 標 和 縱 坐 標 都 不 重 復 . 坐 標 軸 範 圍 在 [ 0 , 1 e9 ] 內 ) 如 下 圖 實 心 點 為 滿 足 條 件 的 點 的 集 合 。
這裡寫圖片描述

請 實 現 代 碼 找 到 集 合 P 中 的 所 有 ” 最 大 “ 點 的 集 合 並 輸 出 。 第 一 行 輸 入 點 集 的 個 數 N , 接 下 來 N 行 , 每 行 兩 個 數 字 代 表 點 的 x 軸 和 Y 軸 。
輸 出
輸 出 “ 最 大 的 ” 點 集 合 , 按 照 x 軸 從 小 到 大 的 方 式 輸 出 , 每 行 兩 個 數 字 分 別 代 表 點 的 x 軸 和 Y 軸 。
樣 例 輸 入

5
1 2
5 3
4 6
7 6
9 0
class Pair implements Comparable<Pair>{
    int x;
    int y;

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(Pair o) {
        return x==o.x ? o.y - y : x - o.x ; //X升序Y降序
    }
}

public class Main
{
    public
static void main(String args[]) { Scanner in = new Scanner(System.in); int n = in.nextInt(); Pair[] arr = new Pair[n]; for ( int i = 0; i < n; i++ ) { int x = in.nextInt(); int y = in.nextInt(); arr[i] = new Pair(x, y); } Arrays.sort(arr); List<Pair> res = new
ArrayList<>(); for ( int i = 0; i < n; i++ ) { boolean f = true; for ( int j = 0; i!=j && j < n; j++ ) { if(arr[i].x < arr[j].x && arr[i].y < arr[j].y) { f = false; break; } } if(f) res.add(arr[i]); } res.forEach((Pair o)->System.out.println(o.x + " " + o.y)); in.close(); } }

另一種解法:

Scanner in = new Scanner(System.in);
int n = in.nextInt();
Pair[] arr = new Pair[n];
for ( int i = 0; i < n; i++ ) {
    int x = in.nextInt();
    int y = in.nextInt();
    arr[i] = new Pair(x, y);
}

Arrays.sort(arr);
List<Pair> res = new ArrayList<>();
res.add(arr[n-1]);
int maxY = arr[n-1].y;
for ( int i = n-2; i >= 0; i-- ) {
    if( arr[i].y >= maxY )
        res.add(arr[i]);
    maxY = Math.max(maxY, arr[i].y);
}
res.forEach((Pair o)->System.out.println(o.x + " " + o.y));
in.close();

第二題

給 定 一 個 數 組 序 列 , 需 要 求 選 出 一 個 區 間 , 使 得 該 區 間 是 所 有 區 間 中 經 過 如 下 計 算 的 值 最 大 的 一 個 : 區 間 中 的 最 小 數 * 區 間 所 有 數 的 和 最 後 程 序 輸 出 經 過 計 算 後 的 最 大 值 即 可 , 不 需 要 輸 出 具 體 的 區
間 。 如 給 定 序 列 [ 6 2 1 ] 則 根 據 上 述 公 式 , 可 得 到 所 有 可 以 選 定 各 個 區 間 的 計 算 值
這裡寫圖片描述
從 上 述 計 算 可 見 選 定 區 間 [ 6 ] , 計 算 值 為 36 , 則 程 序 輸 出 為 36 。
區 間 內 的 所 有 數 字 都 在 [ 0 , 100 ] 的 範 圍 內。
輸 入
第 一 行 輸 入 數 組 序 列 個 數 , 第 二 行 輸 入 數 組 序 列 。
輸 出
輸 出 數 組 經 過 計 算 後 的 最 大 值 。
樣 例 輸 入
3
6 2 1
樣 例 輸 出
36
Hint
對 於 50 % 的 數 據 , 1 < = n < = 10000 .
對 於 1 % 的 數 據 , 1 < = n < = 500000 .

Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for ( int i = 0; i < n; i++ )
    a[i] = in.nextInt();
Arrays.sort(a);
int sum = 0;
for ( int i = 0; i < n; i++ )
    sum += a[i];
int max = a[0] * sum;
for ( int i = 0; i < n-1; i++ ) {
    sum -= a[i];
    max = Math.max(max, a[i+1]*sum);
}
System.out.println(max);
in.close();