全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)

一、最值问题

利用分支结构可以依据具体条件去做决策,通过两个数的比较可以确定这两个数的大小关系,那么三个数也可以通过比较确定其大小关系。

实战训练1---输出最小数

问题描述:

输入三个整数,输出最小的数。

输入格式:

一行三个整数a,b,c,数与数之间用空格隔开。

输出格式:

一行一个整数,即最小的整数。

输入及输出样例:

|----------|-------|
| 输入样例1 | 输出样例1 |
| 3 16 1 | 1 |
| 输入样例2 | 输出样例2 |
| 46 10 23 | 10 |

问题分析:

对于该问题,在这里提供三种解题方式:

**解法1:**只有一个整数时,知道这个整数就是最小值;如果有两个整数a和b,那么通过关系运算符和if语句,可以判断a和b的大小;如果有三个整数a、b和c,那么最小数有三种情况:若a<b且a<c,那么a就是最小值;若b<a且b<c,那么b就是最小值;若c<a且c<b,那么c就是最小值。具体程序代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
	cin>>a>>b>>c;//输入a、b和c
	if(a<b && a<c){//若a<b且a<c,那么a就是最小值
		minv = a;
	}
	if(b<a && b<c){//若b<a且b<c,那么b就是最小值
		minv = b;
	} 
	if(c<a && c<b){//若c<b且c<a,那么c就是最小值
		minv = c;
	}
	cout<<minv<<endl;
	return 0;
}

**解法2:**先将a和b进行比较,得到a和b两个数中的最小值,将最小值赋值给minv,然后将minv和c进行比较,如果c比minv要小,那么将c的值赋值给minv,否则minv保持不变,这样通过两次比较就得到了三个数中的最小值,主要思想是通过比较逐步将求解范围变小,这也是在C++编程中常用的方式,具体程序代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
	cin>>a>>b>>c;//输入a、b和c
	if(a<b ){//将a和b进行比较,如果a<b为真, 
		minv = a;//将a赋值给minv 
	}else{//否则将b赋值给minv 
		minv = b;
	}
	if(c<minv){//若c<minv,那么c就是最小值
		minv = c;//将c赋值给minv 
	} 
	cout<<minv<<endl;
	return 0;
}

**解法3:**借鉴打擂台的思想,如果只有一个整数a,a为擂主,那么最小值就是a;b来了之后,如果将擂主a打败了,那么b称为新的擂主,最小值为b,否则擂主仍为a,a还是最小值;紧接着c来挑战擂主,如果将擂主打败,c称为新的擂主,c成为最小值,否则擂主仍为之前的擂主,具体程序代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
	cin>>a>>b>>c;//输入a、b和c
	minv = a; //先假设最小值为a,即a为擂主 
	if(b<a){// b打败擂主minv,b是新的擂主 
		minv = b;//将b赋值给minv 
	}
	if(c<minv){//c来打擂,c打败擂主minv,c成为新的擂主 
		minv = c;//将c赋值给minv 
	} 
	cout<<minv<<endl;
	return 0;
}

这三种不同的解法,代表了三种不同的程序设计思想,如果涉及n个数据的求解(n很大),那么if语句便不再适用,这时需要学习新的知识------下一阶段的"循环"。

二、简单排序

比拼之下见高低。通过不停地比较,可以知道一些数据的位次,这就是排序。虽然利用if语句实现排序的局限性很大,但是其传达的程序设计思想应用很广泛。

实战训练2---三个数排序

问题描述:

试编一程序,输入三个整数,对这三个整数进行排序,由从小到大顺序输出。

输入格式:

一行三个整数a,b,c,中间用空格隔开。

输出格式:

一行三个整数由小到大排列,中间用空格隔开。

输入及输出样例:

|----------|----------|
| 输入样例1 | 输出样例1 |
| 3 16 1 | 1 3 16 |
| 输入样例2 | 输出样例2 |
| 46 10 23 | 10 23 46 |

问题分析:

可以借鉴实战训练1求解最小值的思想,先让a与b进行比较,如果a比b大,则交换a和b;在将a和c进行比较,如果a比c大,则交换a和c,这样a就存储了这三个数中的最小值;接下来比较b和c的值,如果b大于c,则交换b和c,这样b中存储了次小值,c中存储了这三个数的最大值,这样三个数就完成了排序,具体程序代码如下:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main() {
   	int a,b,c;//定义变量a、b、c
	cin>>a>>b>>c;//输入a、b和c
	if(a>b){//比较a和b的值,a的值比b的值大 ,交换a和b 
		int tmp = a;
		a = b;
		b = tmp; 
	} 
	if(a>c){//比较a和c的值,a的值比c的值大,则交换a和c 
		int tmp = a;
		a = c;
		c = tmp; 
	} 
	if(b>c){//比较b和c的值,b的值比c的值大,则交换b和c 
		int tmp = b;
		b = c;
		c = tmp;
	}
	cout<<a<<' '<<b<<' '<<c<<endl;//从小到大输出a b c 的值 
	return 0;
}

对于三个数排序可以使用上述思想,因为三个数排序有6种情况:

|---|-------|
| 1 | a b c |
| 2 | a c b |
| 3 | b a c |
| 4 | b c a |
| 5 | c a b |
| 6 | c b a |

如果是abcd四个数字排序,有几种可能性?如果是abcde五个数字排序,有几种可能性?结论:这种将情况逐一列出的情况不可取,如果对于4个或者4个以上的数,需要考虑的情况变得复杂了,那么对于更多的数进行排序怎么进行处理呢,这些问题在后续的内容会逐步进行讲解。

相关推荐
Aileen_0v01 分钟前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
是小胡嘛2 分钟前
数据结构之旅:红黑树如何驱动 Set 和 Map
数据结构·算法
m0_748255025 分钟前
前端常用算法集合
前端·算法
呆呆的猫28 分钟前
【LeetCode】227、基本计算器 II
算法·leetcode·职场和发展
Tisfy30 分钟前
LeetCode 1705.吃苹果的最大数目:贪心(优先队列) - 清晰题解
算法·leetcode·优先队列·贪心·
余额不足121381 小时前
C语言基础十六:枚举、c语言中文件的读写操作
linux·c语言·算法
ragnwang2 小时前
C++ Eigen常见的高级用法 [学习笔记]
c++·笔记·学习
yuanManGan2 小时前
数据结构漫游记:静态链表的实现(CPP)
数据结构·链表
火星机器人life3 小时前
基于ceres优化的3d激光雷达开源算法
算法·3d
虽千万人 吾往矣3 小时前
golang LeetCode 热题 100(动态规划)-更新中
算法·leetcode·动态规划