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

一、最值问题

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

实战训练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个以上的数,需要考虑的情况变得复杂了,那么对于更多的数进行排序怎么进行处理呢,这些问题在后续的内容会逐步进行讲解。

相关推荐
闻缺陷则喜何志丹12 分钟前
【数学 线性代数】差分约束
c++·线性代数·数学·差分约束·负环最短路
多思考少编码12 分钟前
AtCoder Beginner Contest 397 A - D题解
c++·算法·atcoder·算法竞赛
奕天者16 分钟前
C++学习笔记(二十一)——文件读写
c++·笔记·学习
江西理工大学小杨20 分钟前
C++菱形继承内存模型
开发语言·c++·算法
浅安的邂逅1 小时前
C++ STL 之常用拷贝和替换算法①copy();②replace();③replace_if();④swap();
开发语言·c++·算法·stl
浅安的邂逅2 小时前
C++ STL 之常用排序算法①sort②random_shuffle③merge④reverse
开发语言·c++·算法·stl·排序算法
ksbglllllll2 小时前
ccfcsp3402矩阵重塑(其二)
数据结构·c++·算法
Mryan20053 小时前
NumPy系列 - 创建矩阵
数据结构·python·线性代数·矩阵·numpy
CHPCWWHSU4 小时前
vulkanscenegraph显示倾斜模型(5.3)-相机
c++·osg·vulkan·vsg
小馒头学python5 小时前
蓝耘智算|从静态到动态:探索Maas平台海螺AI图片生成视频功能的强大能力
人工智能·python·学习·算法·aigc