【贪心】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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章