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();