1. 程式人生 > >2018騰訊暑期實習筆試

2018騰訊暑期實習筆試

       參加騰訊的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;
				}
			}
		}
	}
}