2018騰訊暑期實習筆試
阿新 • • 發佈:2019-01-26
參加騰訊的2018暑期實習生筆試,分享一下最後一道程式設計題。雖說筆試時沒有做完,之後又進行了完善。
題目如下:
小Q有n臺機器和m項任務,每臺機器和任務分別具有兩項屬性:工作時間time和等級grade。一臺機器只能執行一項任務,機器的工作時間和等級必須大於等於任務的工作時間和等級。完成一項任務,收益增加200*time+3*grade。請計算最大收益。
輸入為:首行輸入小Q具有的n臺機器和m項任務,其次為每臺機器的工作時間和等級,最後為每項任務的工作時間和等級;
輸出為:完成的任務數量和最大收益。
示例輸入如下:
1 2
100 3
100 3
80 2
示例輸出如下:
1 20009
解決思路為:為每臺機器挑選其最符合的任務。首先需要符合機器的等級,再挑選能完成的最大工作時間的任務。
具體程式如下:
import java.util.Scanner; public class TencentIntern3 { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.nextLine(); String[] strs = str.trim().split(" "); // 機器數量 int n = Integer.parseInt(strs[0]); // 任務數量 int m = Integer.parseInt(strs[1]); // 完成任務數量 int taskNum = 0; // 收益 int sum = 0; // 記錄機器的工作時間和等級 int[][] machines = new int[n][2]; // 記錄任務的工作時間和等級 int[][] tasks = new int[m][2]; for (int i = 0; i < n; i++) { str = in.nextLine(); strs = str.trim().split(" "); machines[i][0] = Integer.parseInt(strs[0]); machines[i][1] = Integer.parseInt(strs[1]); } for (int i = 0; i < m; i++) { str = in.nextLine(); strs = str.trim().split(" "); tasks[i][0] = Integer.parseInt(strs[0]); tasks[i][1] = Integer.parseInt(strs[1]); } // 機器以時間排序 sort(machines, 0); // 任務以等級排序 sort(tasks, 1); // 遍歷機器 for (int i = 0; i < n; i++) { int grade = 0; int gradeN = 0; // 尋找符合的等級 for (int j = tasks.length - 1; j >= 0; j--) { if (machines[i][1] >= tasks[j][1]) { grade = tasks[j][1]; gradeN = j; break; } grade = -1; } // 沒有找到,跳過 if (grade == -1) { continue; } // 符合等級的排序尋找最大值 sortN(tasks, gradeN + 1, 0); sum = sum + 200 * tasks[gradeN][0] + 3 * tasks[gradeN][1]; taskNum++; // 已找到機器的任務等級設為無線大,使機器無法尋找到 tasks[gradeN][1] = 100000; // 任務恢復以等級排序 sort(tasks, 1); } System.out.println(taskNum + " " + sum); } // 前N個排序 - 遞增 public static void sortN(int[][] arr, int l, int num) { for (int i = 0; i < num; i++) { for (int j = 0; j < num - i - 1; j++) { if (arr[j][l] > arr[j + 1][l]) { int[] x = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = x; } } } } // 氣泡排序 - 遞增 public static void sort(int[][] arr, int l) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j][l] > arr[j + 1][l]) { int[] x = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = x; } } } } }