题面如图所示。
该题与第五次周测的easy version大同小异,前者是进行字符串对比,直接得出答案,后者也就是本题是限制修改答案次数,求出修改后最大的分值。
对于相同答案的题目,我们可以直接把他的分值加上;对于不同答案的题目,我们用一个数组存下他的分值,在遍历完所有题目后,我们对他进行个排序,然后选出m个大分值的题加上去。
注意:开long long!!!
代码如下。
#include<bits/stdc++.h>
typedef long long ll;
const ll mod = 1e9 + 7;
using namespace std;
int c[10010];
int main() {
int n, m;
cin >> n >> m;
string a, b;
cin >> a >> b; //C++的字符串,不会的同学可以用C的char
int k = 0;
ll sum = 0; // 注意开long long
for (int i = 0; i < n; i++) {
int x;
cin >> x;
if (a[i] != b[i]) { //如果答案错误,则把他的分值放入数组c中
c[++k] = x;
}
else { //如果答案正确,则直接加上他的分值。
sum += x;
}
}
sort(c + 1, c + 1 + k); // 快排,没学的同学使用自己会的排序方法
if (k < m) { // 如果错误答案数小于最大修改数,则说明所有的错误题目的分值均可加上去
for (int i = k; i >= 1; i--) {
sum += c[i];
}
}
else { // 如果错误答案大于等于最大修改数,则把前m大的分值加上去
for (int i = k; m > 0; m--, i--) {
sum += c[i];
}
}
cout << sum;
return 0;
}