演算法題-測試用例執行計劃

阿茶發表於2024-05-10

題目描述
某個產品當前迭代週期內有N個特性(F1, F2, ..., FN)需要進行覆蓋測試,每個特性都被評估了對應的優先順序,特性使用其ID作為下標進行標識。

設計了M個測試用例(T1, T2,...,TM),每個用例對應了一個覆蓋特性的集合,測試用例使用其ID作為下標進行標識,測試用例的優先順序定義為其覆蓋的特性的優先順序之和。

在開展測試之前,需要制定測試用例的執行順序,規則為:優先順序大的用例先執行,如果存在優先順序相同的用例,用例ID小的先執行。

輸入描述
第一行輸入為N和M,N表示特性的數量,M表示測試用例的數量。

之後N行表示特性ID=1到特性ID=N的優先順序。

再接下來M行表示測試用例ID=1到測試用例ID=M關聯的特性的ID的列表。

輸出描述
按照執行順序(優先順序從大到小)輸出測試用例的ID,每行一個ID。

測試用例
輸入
5 4
1
1
2
3
5
1 2 3
1 4
3 4 5
2 3 4

輸出
3
4
1
2
測試用例
輸入
3 3
3
1
5
1 2 3
1 2 3
1 2 3

輸出
1
2
3

程式碼

public class TestSort {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int N = in.nextInt();
            int[] priority = new int[N];
            int M = in.nextInt();
            int[] sum = new int[M];
            Arrays.fill(sum, 0);
            for (int i=0; i< N ;i++) {
                priority[i] = in.nextInt();
            }
            in.nextLine();
            for (int i=0; i< M; i++) {
                String testFeature = in.nextLine();
                String[] features = testFeature.split(" ");
                for (int j=0; j< features.length; j++) {
                    int feature = Integer.parseInt(features[j]);
                    sum[i]+= priority[feature-1];
                }
            }

            int[] result = new int[M];
            for (int i=0; i<M ;i++) {
                result[i] = i;
            }

            for (int i=0; i<M-1; i++) {
                int max = i;
                for (int j=i+1; j<M; j++) {
                    if (sum[result[j]]>sum[result[max]]) {
                        max = j;
                    }
                }
                if (max != i) {
                    int tmp = result[i];
                    result[i] = result[max];
                    result[max] = tmp;
                }
            }

            for (int i=0; i<M; i++) {
                System.out.println(result[i]+1);
            }
        }
    }
}

相關文章