题解:P12887 [蓝桥杯 2025 国 Java B] 答题数量

题解:P12887 [蓝桥杯 2025 国 Java B] 答题数量

Link

本题重点即为如何求出小蓝和他的好朋友都答对的题的取值范围。

设只有小蓝答对的题为 \(T_b\),只有朋友答对的题数量为 \(T_f\),他们都答对的题数目为 \(S_{T}\),他们答案相同的题目数为 \(S\)。题目总数为 \(N\)

我们要求出 \({S_{T}}_{max}\)。因为朋友答对的所有题数量为 \(M\),当 \(S>M\) 时,显然 \({S_{T}}_{max}=M\)。反之,\({S_{T}}_{max}=S\)。因此 \(S_{T}\) 的区间为 \([0,\min(S,M)]\),即 \({S_{T}}_{max}=\min(S,M)\)

接下来我们来看不同位置,因为此时两人答案不同,所以只有一人对一人错。此时因为两人答案相同的题目数为 \(S\),所以他们答案不相同的题目数为 \(N-S\),只有小蓝答对的题数为 \(T_b=N-S-T_f\)

综上,答案为:

\[\begin{align*} T_b+{S_{T}}_{max} &= {S_{T}}_{max} + N-S- T_f\\ &= {S_{T}}_{max} + N-S- (M-{S_{T}}_{max})\\ &= 2 \cdot {S_{T}}_{max} + N-S- M\\ &= 2 \cdot \min(S,M)+N-S- M \end{align*} \]

//C++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,cnt;
string s,t;
int main(){
    cin>>n>>m;
    cin>>s>>t;
    for(int i=0;i<n;i++){
        if(s[i]==t[i]) cnt++;
    }
    ll ans=2*min(cnt,m)+n-cnt-m;
    cout<<ans;
    return 0;
}
//java
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        long n=scanner.nextLong();
        long m=scanner.nextLong();
        scanner.nextLine(); 
        String s=scanner.nextLine();
        String t=scanner.nextLine();
        long cnt=0;
        for (int i=0;i<n;i++){
            if(s.charAt(i)==t.charAt(i)) cnt++;
        }
        long ans=2*Math.min(cnt,m)+n-cnt-m;
        System.out.println(ans);
    }
}
posted @ 2025-06-22 18:57  M1_Byte  阅读(8)  评论(0)    收藏  举报