一、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();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,