当前位置: 首页 > article >正文

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

一、最值问题

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

实战训练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就是最小值。具体程序代码如下:


#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++编程中常用的方式,具体程序代码如下:


#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成为最小值,否则擂主仍为之前的擂主,具体程序代码如下:


#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中存储了这三个数的最大值,这样三个数就完成了排序,具体程序代码如下:


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


http://www.kler.cn/a/450685.html

相关文章:

  • vue中proxy代理配置(测试二)
  • 图像处理-Ch6-彩色图像处理
  • uniapp跨平台开发---webview调用app方法
  • 性能优化!突破性能瓶颈的尖兵CPU Cache
  • Redis+注解实现限流机制(IP、自定义等)
  • WebAPI编程(第一天,第二天)
  • RTOS下的任务管理
  • 分体空调智能控制系统
  • leetcode79:单词搜索
  • http的访问过程或者访问页面会发生什么
  • 【国产NI替代】基于FPGA的4通道电压 250M采样终端边缘计算采集板卡,主控支持龙芯/飞腾
  • C# OpenCV机器视觉:缺陷检测
  • Web前端基础知识(一)
  • myexcel的使用
  • workman服务端开发模式-应用开发-vue-element-admin挂载websocket
  • Log4j2漏洞复现
  • 使用git管理项目版本
  • 基于Liveweb地铁轨道交通视频监控综合管理系统方案
  • 【ROS2】坐标TF发布(静态)
  • 支付域——支付路由设计
  • Flutter组合动画学习
  • Linux系统编程深度解析:C语言实战指南
  • 了解RPC
  • 《Web 应用项目开发:从构思到上线的全过程》
  • UE5 渲染管线 学习笔记
  • 全国硕士研究生入学考试(考研)考研时间线之大三