专栏文章

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

B4397题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio1szw2
此快照首次捕获于
2025/12/02 11:58
3 个月前
此快照最后确认于
2025/12/02 11:58
3 个月前
查看原文
Hello ,大家好呀!这是我的第一篇全站推荐的题解,希望 dalao 们多多指教 qwq !

题目传送门

题目大意

我先把这张图放这里,方便大家看。
题目里说,顺序为从上到下,从左到右,那我们不妨将白色和红色的点设一下,如下图所示:
题面还说, ss 是这个三角形每个边的和,并且白色的点会给出数字,而红色的是我们要求的。同时,所有的点都不会超过 12 ,所以,如果用我的做法,用数据类型 shortshort 是最好的选择,因为他能符合这道题的数据范围,又能减少空间复杂度。
从上文可知, r2r2 等于 sa1a2a4a8s - a1 - a2 - a4 - a8 ,所以 r2r2 是可以直接求出来的。同样的, r3r3 就等于 sa6a7a8s - a6 - a7 -a8
求出来这两个之后,我们可以循环找一下剩下的3个数,最后再两两判断是不是等于 r3r3 ,如果等于,就可以直接输出。例如:
CPP
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;
	}
}
最后,我们再判断一下,就可以输出了:
CPP
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;
所以,我们可以得到一份完整的 codecode
CPP
#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 ptspts ???(发狂)
注意
这个时候,我们要注意一开始没有设的红点。我们的 r3r3 还需要判断一下是那个在右边,哪个在左边。
这时,我们就可以通过左边的那一列判断那个在左边哪个在右边,这部分的代码如下:
CPP
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;
亿 一点点肝。
最后,整体的代码就出来了:
CPP
#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;
}
交上去一试, 100pts100 pts !(狂喜)
话说我比赛的时候怎么脑抽了?
好啦,这篇题解就结束啦,这是本蒟蒻第一篇全站推荐的题解,管理员大大求过 qwq ~~

评论

0 条评论,欢迎与作者交流。

正在加载评论...