题解:B4397 [蓝桥杯青少年组国赛 2025] 第二题

· · 题解

Hello ,大家好呀!这是我的第一篇全站推荐的题解,希望 dalao 们多多指教 qwq !

题目传送门

题目大意

我先把这张图放这里,方便大家看。

题目里说,顺序为从上到下,从左到右,那我们不妨将白色和红色的点设一下,如下图所示:

题面还说, s 是这个三角形每个边的和,并且白色的点会给出数字,而红色的是我们要求的。同时,所有的点都不会超过 12 ,所以,如果用我的做法,用数据类型 short 是最好的选择,因为他能符合这道题的数据范围,又能减少空间复杂度。

从上文可知, r2 等于 s - a1 - a2 - a4 - a8 ,所以 r2 是可以直接求出来的。同样的, r3 就等于 s - a6 - a7 -a8

求出来这两个之后,我们可以循环找一下剩下的3个数,最后再两两判断是不是等于 r3 ,如果等于,就可以直接输出。例如:

for(int i=1;i<=12;i++){
if(a1!=i&&a2!=i&&a3!=i&&a4!=i&&a5!=i&&a6!=i&&a7!=i&&a8!=i&&r2!=i){
        cnt++;//此处的cnt是为了将3个数分开做的计数器
        if(cnt==1) t1=i;
        if(cnt==2) t2=i;
        if(cnt==3) t3=i;
    }
}

最后,我们再判断一下,就可以输出了:

if(t1+t2==r3) cout<<t3<<" "<<r2<<" "<<t1<<" "<<t2;
if(t1+t3==r3) cout<<t2<<" "<<r2<<" "<<t1<<" "<<t3;
if(t2+t3==r3) cout<<t1<<" "<<r2<<" "<<t2<<" "<<t1;

所以,我们可以得到一份完整的 code

#include<bits/stdc++.h>
using namespace std;
int main(){
    int s;
    cin>>s;
    short t1,t2,t3,cnt=0,a1,a2,a3,a4,a5,a6,a7,a8,r2,r3;
    cin>>a1>>a2>>a3>>a4>>a5>>a6>>a7>>a8;
    r2=s-a1-a2-a4-a8;
    r3=s-a6-a7-a8;
    for(int i=1;i<=12;i++){
        if(a1!=i&&a2!=i&&a3!=i&&a4!=i&&a5!=i&&a6!=i&&a7!=i&&a8!=i&&r2!=i){
            cnt++;
            if(cnt==1) t1=i;
            if(cnt==2) t2=i;
            if(cnt==3) t3=i;
        }
    }
    if(t1+t2==r3) cout<<t3<<" "<<r2<<" "<<t1<<" "<<t2;
    if(t1+t3==r3) cout<<t2<<" "<<r2<<" "<<t1<<" "<<t3;
    if(t2+t3==r3) cout<<t1<<" "<<r2<<" "<<t2<<" "<<t1;
    return 0;
}

交上去试一下...怎么只有50 pts ???(发狂)

:::::warning[注意] 这个时候,我们要注意一开始没有设的红点。我们的 r3 还需要判断一下是那个在右边,哪个在左边。 ::::: 这时,我们就可以通过左边的那一列判断那个在左边哪个在右边,这部分的代码如下:

if(t1+t2==r3&&t1+t3+a1+a3+a5==s) cout<<t3<<" "<<r2<<" "<<t1<<" "<<t2;
    else if(t1+t2==r3&&t2+t3+a1+a3+a5==s) cout<<t3<<" "<<r2<<" "<<t2<<" "<<t1;
    else if(t1+t3==r3&&t1+t2+a1+a3+a5==s) cout<<t2<<" "<<r2<<" "<<t1<<" "<<t3;
    else if(t1+t3==r3&&t3+t2+a1+a3+a5==s) cout<<t2<<" "<<r2<<" "<<t3<<" "<<t1;
    else if(t2+t3==r3&&t2+t1+a1+a3+a5==s) cout<<t1<<" "<<r2<<" "<<t2<<" "<<t3;
    else if(t2+t3==r3&&t3+t1+a1+a3+a5==s) cout<<t1<<" "<<r2<<" "<<t3<<" "<<t2;

亿 一点点肝。

最后,整体的代码就出来了:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int s;
    cin>>s;
    short t1,t2,t3,cnt=0,a1,a2,a3,a4,a5,a6,a7,a8,r2,r3;
    cin>>a1>>a2>>a3>>a4>>a5>>a6>>a7>>a8;
    r2=s-a1-a2-a4-a8;
    r3=s-a6-a7-a8;
    for(int i=1;i<=12;i++){
        if(a1!=i&&a2!=i&&a3!=i&&a4!=i&&a5!=i&&a6!=i&&a7!=i&&a8!=i&&r2!=i){
            cnt++;
            if(cnt==1) t1=i;
            if(cnt==2) t2=i;
            if(cnt==3) t3=i;
        }
    }
    if(t1+t2==r3&&t1+t3+a1+a3+a5==s) cout<<t3<<" "<<r2<<" "<<t1<<" "<<t2;
    else if(t1+t2==r3&&t2+t3+a1+a3+a5==s) cout<<t3<<" "<<r2<<" "<<t2<<" "<<t1;
    else if(t1+t3==r3&&t1+t2+a1+a3+a5==s) cout<<t2<<" "<<r2<<" "<<t1<<" "<<t3;
    else if(t1+t3==r3&&t3+t2+a1+a3+a5==s) cout<<t2<<" "<<r2<<" "<<t3<<" "<<t1;
    else if(t2+t3==r3&&t2+t1+a1+a3+a5==s) cout<<t1<<" "<<r2<<" "<<t2<<" "<<t3;
    else if(t2+t3==r3&&t3+t1+a1+a3+a5==s) cout<<t1<<" "<<r2<<" "<<t3<<" "<<t2;
    return 0;
}

交上去一试, 100 pts !(狂喜)

话说我比赛的时候怎么脑抽了?

好啦,这篇题解就结束啦,这是本蒟蒻第一篇全站推荐的题解,管理员大大求过 qwq ~~