【貪心】B042_NK_考試成績(計數 + 排序)

一、Problem

現在你的班級剛剛參加了一個只有單選題的考試。班級一共n個學生,考試有m個問題。每個題目都有5個可選答案(A,B,C,D,E)。並且每個題目只有一個正確答案。每個題目的分數並不一樣,第i個題目的分數用a[i]表示。如果題目沒答對該題會獲得0分。

考試結束後,每個學生都記得自己的答案,但是他們還不知道正確答案是什麼。如果非常樂觀的考慮,他們班級最多可能得到多少分呢?

輸入描述:
第一行包含2個正整數,n和m。(1 <= n, m <= 1000,n是班級中學生數量,m是題目的數量)

下面n行數據每行包含一個string si,表示第i個學生的答案。si的第j個字符表示該學生第j個題目的答案。

輸出描述:
一個正整數,全班學生最大的可能獲得的分數總和。

輸入例子1:
2 4
ABCD
ABCE
1 2 3 4

輸出例子1:
16

例子說明1:
最優的答案是ABCD,這樣2個學生的總分是16。

二、Solution

方法一:貪心

題目的意思就是求能所有考生的最大分數的答案序列,那麼假如有 4 道題:

  • 我肯定要知道每道題的選項的被選人數,然後根據被選人數去設置題目的答案才能夠讓分數最大化。
  • 所以,我們將每道題的選項都先計數,然後根據每道題最多人選的選項來計算分數。
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
    static class Solution {
        void init() {
            Scanner sc = new Scanner(new BufferedInputStream(System.in));
            int n = sc.nextInt(), m = sc.nextInt();
            char[][] g = new char[n][m];
            
            int mp[][] = new int[m][5];
            for (int i = 0; i < n; i++) {
                String s = sc.next();
                for (int j = 0; j < m; j++) {
                    g[i][j] = s.charAt(j);
                    int pID = s.charAt(j) - 'A';
                    mp[j][pID]++;
                }
            }
            int sum = 0, s[] = new int[m];
            for (int i = 0; i < m; i++) s[i] = sc.nextInt();

            for (int j = 0; j < m; j++) {
                Arrays.sort(mp[j]);
                int cnt = mp[j][4];
                sum += cnt * s[j];
            }
            System.out.println(sum);
        }
    }
    public static void main(String[] args) throws IOException {  
        Solution s = new Solution();
        s.init();
    }
}

複雜度分析

  • 時間複雜度:O(n×m)O(n × m)
  • 空間複雜度:O(n×m)O(n × m)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章