现在你的班级刚刚参加了一个只有单选题的考试。班级一共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个题目的答案。
一个正整数,全班学生最大的可能获得的分数总和。
2 4 ABCD ABCE 1 2 3 4
16
最优的答案是ABCD,这样2个学生的总分是16。
3 3 ABC BCD CDE 5 4 12
21
最优的答案是CCC,3个学生的总分是5+4+12=21
import java.util.*;
public class Main {
public static void main(String[] arg){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
String[] sl = new String[n];
for (int i=0;i<n;i++){
sl[i] = in.next();
}
int total = 0;
for (int i=0;i<m;i++){
int sc = in.nextInt();
int max=0;
int[] d = new int[5];
for(String s : sl){
int index = (int)s.charAt(i)-(int)'A';
d[index]++;
max = Math.max(max,d[index]);
}
total += (max*sc);
}
System.out.println(total);
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
sc.nextLine();
char[][] ans=new char[n][m];
for(int i=0;i<n;i++){
String s=sc.nextLine();
ans[i]=Arrays.copyOf(s.toCharArray(),m);
}
int[] score=new int[m];
for(int i=0;i<m;i++){
score[i]=sc.nextInt();
}
int res=0;
for(int j=0;j<m;j++){
int tmp=0;
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<n;i++){
int key=ans[i][j]-'A';
if(map.containsKey(key)){
int t=map.get(key);
map.put(key,t+1);
tmp=Math.max(tmp,t+1);
}else{
map.put(key,1);
tmp=Math.max(1,tmp);
}
}
res+=tmp*score[j];
}
System.out.println(res);
}
}
import java.util.*;
public class Main {
public static int MaxScore(int n, int m, String[] answer, int[] score) {
int res = 0;
int index = 0;
for (int i = 0; i < m; i++) {
/*每道题有5个答案*/
int[] count = {0, 0, 0, 0, 0};
int max = 0;
for (int j = 0; j < n; j++) {
if (answer[j].charAt(i) == 'A') {
max = max > ++count[0] ? max : count[0];
} else if (answer[j].charAt(i) == 'B') {
max = max > ++count[1] ? max : count[1];
} else if (answer[j].charAt(i) == 'C') {
max = max > ++count[2] ? max : count[2];
} else if (answer[j].charAt(i) == 'D') {
max = max > ++count[3] ? max : count[3];
} else if (answer[j].charAt(i) == 'E') {
max = max > ++count[4] ? max : count[4];
}
}
res += max * score[index++];
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
String[] str = new String[n];
int[] score = new int[m];
for (int i = 0; i < n; i++) {
str[i] = sc.next();
}
for (int i = 0; i < m; i++) {
score[i] = sc.nextInt();
}
System.out.println(MaxScore(n, m, str, score));
}
}
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String l1 = sc.nextLine();
//学生和题目数量存储在num中 学生[0] 题目[1]
String [] num = l1.split(" ");
int num_student = Integer.parseInt(num[0]);
int num_question = Integer.parseInt(num[1]);
String [] final_answer = {"A","B","C","D","E"};
String [] answer = new String[num_student];
int score=0;
for(int i=0;i<num_student;i++) {
String temp = sc.nextLine();
answer[i]=temp;
}
String temp = sc.nextLine();
String [] str_score = temp.split(" ");
//里面存储了各个题的分值
int [] count = {0,0,0,0,0,0};
for(int i=0;i<num_question;i++) {
//每次重新赋值
for(int l=0;l<count.length;l++) {
count[l]=0;
}
for(int k=0;k<num_student;k++) {
count[answer[k].charAt(i)-'A']+=1;
//count为该题的统计,找出其中数量最多的即可
}
//找出其中数量最大的
int local=0;
int max = count[local];
for(int p=1;p<count.length;p++) {
if(count[p]>max) {
max=count[p];
local = p;
}
}
score+=max*(Integer.parseInt(str_score[i]));
}
System.out.println(score);
}
}
//复杂度为O(n^2)的无脑暴力法:把所有答案记录到char[][] paper中,按列检查最多的答案数放到ans[]中,
//乘以对应积分,遍历m个考试题得到最高分
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int stuNum = sc.nextInt();
int quesNum = sc.nextInt();
char[][] paper = new char[stuNum][quesNum];
for (int i = 0; i < stuNum; i++) {
String str0 = sc.next();
for (int j = 0; j < quesNum; j++) {
paper[i][j] = str0.charAt(j);
}
}
int[] score = new int[quesNum];
for (int i = 0; i < quesNum; i++) {
score[i] = sc.nextInt();
}
int res = 0;
for (int j = 0; j < quesNum; j++) {
int[] ans = new int[5];
for (int i = 0; i < stuNum; i++) {
ans[paper[i][j] - 'A']++;
}
int max = 0;
for (int t = 0; t < 5; t++) {
max = Math.max(max, ans[t]);
}
res += max * score[j];
}
System.out.println(res);
}
}
} import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int studentNum = in.nextInt();
int questionNum = in.nextInt();
int[][] count = new int[questionNum][5];
int[] scoreArr = new int[questionNum];
int sum = 0;
String[] studentAns = new String[studentNum];
//答案初始化
for(int i =0;i<studentNum;i++) {
studentAns[i] = in.next();
}
//分数数组初始化
for(int i=0;i<questionNum;i++) {
scoreArr[i] = in.nextInt();
}
//遍历字符串数组
for(int i=0;i<studentNum;i++) {
for(int j =0;j<questionNum;j++) {
if(studentAns[i].charAt(j)=='A') {
count[j][0] ++;
}else if(studentAns[i].charAt(j)=='B') {
count[j][1] ++;
}else if(studentAns[i].charAt(j)=='C') {
count[j][2] ++;
}else if(studentAns[i].charAt(j)=='D') {
count[j][3] ++;
}else {
count[j][4] ++;
}
}
}
for(int line =0;line<questionNum;line++) {
Arrays.sort(count[line]);
int maxK = count[line][4];
sum += maxK*scoreArr[line];
}
System.out.println(sum);
}
}
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<string> s(n,"");
for(int i=0;i<n;++i) cin>>s[i];
vector<int> value(m,0);
for(int j=0;j<m;++j) cin>>value[j];
vector<int> max_ch_num;
for(int j=0;j<m;++j){
map<char,int> mp;
for(int i=0;i<n;++i) mp[s[i][j]]++;
int max_value=0;
for(auto it=mp.begin();it!=mp.end();++it)
max_value=max_value>it->second?max_value:it->second;
max_ch_num.push_back(max_value);
}
int res = 0;
for(int i=0;i<m;++i)
res+=value[i]*max_ch_num[i];
cout<<res;
return 0;
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int [][] ans = new int[m][5];
for(int i = 0; i < n; i++){
String line = in.next();
int j = 0;
for(char c:line.toCharArray()){
ans[j++][c-'A'] ++;
}
}
int [] score = new int[m];
for(int i = 0;i < m; i ++)
score[i] = in.nextInt();
int result = 0;
for(int i = 0; i < m; i++){
int max = ans[i][0];
for(int j =1; j < 5; j++ ){
max = Math.max(max,ans[i][j]);
}
result+=max*score[i];
}
System.out.println(result);
}
} //求每道题最大相同数量 * 分数即可 不知道有没有更优的解法,反正这个通过
#include<bits/stdc++.h>
using namespace std;
struct Node{
int i;
int score;
Node(){
}
Node(int _i, int _score):i(_i),score(_score){}
friend bool operator<(Node n1,Node n2){
return n1.score <= n2.score;
}
};
class Solution{
public:
int maxScore(vector<string> arr,set<Node> st){
set<Node>::iterator iter;
unordered_map<char,int> mp;
int res = 0;
int sum = 0;
for(iter = st.begin();iter !=st.end();iter++){
for(int i=0;i<arr.size();i++){
mp[arr[i][(*iter).i]]++;
res = max(res, mp[arr[i][(*iter).i]]);
}
//计算出有多少个;
sum += (*iter).score * res;
res = 0;
mp.clear();
}
return sum;
}
};
int main(){
int n,m;
cin>>n>>m;
vector<string> arr(n);
for(int i=0;i<n;i++){
cin>>arr[i];
}
set<Node> st;
int score;
for(int i=0;i<m;i++){
cin>>score;
st.insert(Node(i,score));
}
Solution c1;
cout<<c1. maxScore(arr,st)<<endl;
return 0;
} import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] strs = sc.nextLine().split(" ");
int n = Integer.parseInt(strs[0]);//学生数量
int m = Integer.parseInt(strs[1]);//题目数量
int[] times = new int[5];
String[] answers = new String[n];
for (int i = 0; i < n; i++) {
answers[i] = sc.nextLine();
}
int[] scores = new int[m];
strs = sc.nextLine().split(" ");
for (int i = 0; i < m; i++) {
scores[i] = Integer.parseInt(strs[i]);
}
int sumScores = 0;
for (int i = 0; i < m; i++) {
int maxTimes = Integer.MIN_VALUE;
for (int j = 0; j < n; j++) {
if (answers[j].charAt(i) == 'A') {
times[0]++;
maxTimes = Math.max(maxTimes, times[0]);
} else if (answers[j].charAt(i) == 'B') {
times[1]++;
maxTimes = Math.max(maxTimes, times[1]);
} else if (answers[j].charAt(i) == 'C') {
times[2]++;
maxTimes = Math.max(maxTimes, times[2]);
} else if (answers[j].charAt(i) == 'D') {
times[3]++;
maxTimes = Math.max(maxTimes, times[3]);
} else if (answers[j].charAt(i) == 'E') {
times[4]++;
maxTimes = Math.max(maxTimes, times[4]);
}
}
sumScores += maxTimes * scores[i];
Arrays.fill(times,0);
}
System.out.println(sumScores);
}
} import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int f(int n, int m, String[] answer, int[] scores) {
int res = 0;
char[][] a = new char[n][m];
int[][] book = new int[5][m];
for (int i = 0; i < answer.length; i++) {
String aAnswer = answer[i];
for (int j = 0; j < aAnswer.length(); j++) {
a[i][j] = aAnswer.charAt(j);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
book[a[j][i] - 65][i] += 1;
}
}
for (int i = 0; i < m; i++) {
int max = Integer.MIN_VALUE;
for (int j = 0; j < 5; j++) {
max = max < book[j][i] ? book[j][i] : max;
}
res += scores[i] * max;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
String[] a = new String[n];
int[] score = new int[m];
for (int i = 0; i < n; i++) {
a[i] = sc.next();
}
for (int i = 0; i < m; i++) {
score[i] = sc.nextInt();
}
System.out.print(f(n, m, a, score));
}
}
#include <iostream>
using namespace std;
int point[10010];
int a[10010][5];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
char t;
cin >> t;
a[j][t-'A']++;
}
int res = 0;
for(int j = 0; j < m; j++)
{
int mm = 0;
cin >> point[j];
for(int k = 0; k <= 4; k++)
mm = max(mm, a[j][k]);
res += mm*point[j];
}
cout << res << endl;
return 0;
} import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 思路:每道题每个选项出现的次数最多即为此题最理想答案,如果平均则随机选一个为正确答案
*/
public class Main {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n,m;
n=scanner.nextInt();
m=scanner.nextInt();
//存放学生自己的答案
String[] Ansers=new String[n];
for(int i=0;i<n;i++){
Ansers[i]=scanner.next();
}
//存放每个题的分值
int[] points=new int[m];
for(int j=0;j<m;j++){
points[j]=scanner.nextInt();
}
//建立二维数组方便统计每道题
char[][] p=new char[n][m];
for(int i=0;i<n;i++){
char[] str=Ansers[i].toCharArray();
p[i]=str;
}
int[] flag;//因为每个题最多只有五个答案,标记A--E每个选项出现的次数
char[] anser=new char[m];//记录选定的标准答案
int maxValue;
int maxIndex;
int w=0;
//统计每一列(题)每个选项出现的最大次数,并且标记此答案
for(int j=0;j<m;j++){
maxValue=0;
maxIndex=0;
flag=new int[5];
for(int i=0;i<n;i++){
flag[p[i][j]-'A']++;
}
for(int x=0;x<5;x++){
if(flag[x]>maxValue){
maxValue=flag[x];
maxIndex=x;
}
}
anser[w]=(char) (maxIndex+'A');
w++;
}
// System.out.println(anser);
//计算最终分数
int sumPoints=0;
for(int j=0;j<m;j++){ //列
for (int i=0;i<n;i++){ //行
if(p[i][j]==anser[j])
sumPoints=sumPoints+points[j];
}
}
System.out.println(sumPoints);
}
}
#include <iostream>
(720)#include <string>
#include <vector>
(721)#include<algorithm>
using namespace std;
class Solution{
public:
long long test(int n, int m, vector<string> s, vector<int> score)
{
long long res = 0;
for (int i=0;i<m;i++)
{
vector<int> temp(5);// ABCDE五个答案
for (int j=0;j<n;j++)
{
temp[s[j][i]-'A']++;
}
int most_ans = *max_element(temp.begin(),temp.end());
// sort(temp.begin(),temp.end());
// int most_ans = temp.back();
res+=most_ans*score[i];
}
return res;
}
};
int main()
{
int n;
int m;
cin >> n >> m;
vector<string> s(n);
for (int i = 0; i < n; i++)
{
cin >> s[i];
}
vector<int>score(m);
for (int j = 0; j < m; j++)
cin >> score[j];
long long res = Solution().test(n,m,s,score);
cout << res << endl;
return 0;
} public static void testCalcScore(){
// int n = 2,m = 4;
// String[] results = {"ABCD","ABCE"};
// int[] scores = {1,2,3,4};
// day01.score(n,m,results,scores);
int n = 3,m = 3;
String[] results = {"ABC","BCD","CDE"};
int[] scores = {5,4,12};
day01.calcScore(n,m,results,scores);
}
public long calcScore(int n,int m,String[] results,int[] scores){
Map<Character,Integer>[] map = new HashMap[m];
long totalScore = 0;
StringBuilder sb = new StringBuilder();
for (String result:results){
for (int i=0;i<result.length();i++){
Character option = result.charAt(i);
if(map[i] == null) map[i] = new HashMap<>();
if(map[i].containsKey(option)) {
map[i].computeIfPresent(option, (k,v) -> v + 1);
}else {
map[i].put(option, 1);
}
}
}
for (int i=0;i<scores.length;i++){
Optional<Map.Entry<Character, Integer>> resultEntry = map[i].entrySet().stream().sorted((a, b) -> b.getValue() - a.getValue()).findFirst();
if(resultEntry.isPresent()){
sb.append(resultEntry.get().getKey());
totalScore += scores[i] * resultEntry.get().getValue();
}
}
System.out.println(String.format("最优的答案是%s,这样%s个学生的总分是%s。",sb.toString(),n,totalScore));
return totalScore;
}