其实这道题看案例就可以明白,然后数据也不大,所以我第一时间想到的就是对于一道题的答案尽可能多的学生写对,这样才能保证拿到的总分最高,主要有点需要思维的是如何枚举的问题,其实直接开个一维string就够了,然后枚举每列;统计出现相同字母次数最多的就行,之后用:个数*分数,就是这个题所对应的所有学生答对的最大分数(注意分数需要用一个数组来存,这样才能在逻辑上对应每个题所对应的答案的下标);
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s[1010];
map<char,int> mm;
int main(){
int n,m;
int score[1010];
char c;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=m;i++) cin>>score[i];
int Max=0;
int ans=0,k=0;//这里的k用来枚举列,其实也可以用下面的for循环里面的i-1来表示
for(int i=1;i<=m;i++){
Max=0;
for(int j=1;j<=n;j++){
mm[s[j][k]]++;
Max=max(Max,mm[s[j][k]]);
}
k++;
ans+=Max*score[i];
mm.clear();//注意每次循环需要清空
}
printf("%d\n",ans);
return 0;
}