一、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();
}
}
复杂度分析
- 时间复杂度: ,
- 空间复杂度: ,