Advertisement

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

阅读量:

打标记思想:

该方法的思想与贴上封条相似 通过使用标记的方式 可以用"贴上封条"这样的比喻来明确该区域的状态是否发生过变更 为了实时监控某个地点在执行操作后的状态变化情况 在该位置设置一个可追踪标志 然后只需观察此标志的状态变化情况即可

以布尔类型变量 flag 为例,在其初始阶段将其设置为 true 这一操作通常被称为变量初始化的过程。当某个特定操作顺利完成时,则可以将 flag 状态更新为 false。通过查看 flag 状态的变化情况即可明确确认该操作是否已完成。

实战训练1—阅读下面程序,写成结果。

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main() {
    
    	bool flag = true;
    
 	int n;
    
 	cin>>n;
    
 	if(n%2==0){
    
 		flag = false;
    
 	}
    
 	if(flag){
    
 		cout<<"YES"<<endl;
    
 	}else{
    
 		cout<<"NO"<<endl;
    
 	}
    
 	return 0;
    
 }

键盘输入: 9

输出结果:YES

问题分析:

代码第4行声明一个布尔型变量并将其初始化为true状态。随后在第5行定义变量n用于接收输入数值。在第6行通过标准输入获取数据并赋值给n变量。假设用户提供的输入数值是9,则系统将进行如下判断:检查n能否被2整除即确定其是否具有偶数特性。在此基础上系统会利用预先声明好的标志位来辅助判定具体属性:若标志位显示true则表明该数值属于奇数范畴;反之若标志位设为false就意味着该数值是一个偶数。对于本题中的测试案例由于输入数值设定为9(奇数),因此系统应输出结果"YES"以确认其正确性

实战训练2—字母排序

问题描述:

输入三个字母(严格区分大小写),按字典顺序输出它们。

输入格式:

输入三个字母

输出格式:

输出字母,按照字典顺序输出它们。

输入输出样例:

输入样例1 输出样例1
dcb bcd
输入样例2 输出样例2
AaB ABa

问题分析:

按照题目要求,在字符排序算法中首先定义三个变量a、b和c,并输入相应的字符值。在字符比较过程中,首先会将每个字符转换为对应的Unicode值(即整数值)。根据这些数值的大小关系来确定它们的排列顺序:大写字母对应的Unicode值小于小写字母对应的值。因此,在排序过程中需要先对a和b进行比较:如果a大于b,则交换两者的值;接着再对a和c进行比较:如果a大于c,则交换两者的值;此时变量a中存储的就是这三个字符中的最小值。随后继续对剩余的两个变量b和c进行比较并交换操作:如果b大于c,则交换两者的值;最终变量b中存储的是次小的字符,而变量c中存储的是最大的那个字符。通过这样的逐步排序过程即可完成三个字符的正确排列顺序,并在此基础上编写相应的程序代码如下:

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

实战训练3—最大值与最小值

问题描述:

小明与小敏进行一场游戏,在游戏中双方各自持有三个整数。每位玩家将选取自己手上的一个整数与对方的一个整数进行相乘操作,并将这三个结果分别相乘后形成三组数值。接着计算这三组数值的总和。请求编写一段程序代码来计算这个总和的最大值maxv 和最小值minv

输入格式:

第一行三个整数 a1,a2,a3,用空格隔开,表示小明手中的三个数。

第二行三个整数 b1,b2,b3,用空格隔开,表示小敏手中的三个数。

0<=a1,a2,a3<=9999

0<=b1,b2,b3<=9999

输出格式:

一行两个整数,minv和maxv表示最小值和最大值,用空格隔开

输入输出样例:

输入样例1 输出样例2
4 8 3 6 2 5 54 74

问题分析:

将小明与小敏各自拥有的三个数字进行升序排列,并对其中一组进行升序排列与另一组进行降序排列后对应相乘并求其总合以获得最小值;若将两组数据均按升序排列后依次配对相乘并求其总合则可获得最大值。具体的程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main() {
    
 	int a1,a2,a3;//定义小明手中的数字变量a1,a2,a3
    
 	int b1,b2,b3;//定义小敏手中的数字变量b1,b2,b3
    
 	int minv,maxv;//定义乘积和的最大值maxv和最小值minv 
    
 	cin>>a1>>a2>>a3;//输入a1,a2,a3的值
    
 	cin>>b1>>b2>>b3;//输入b1,b2,b3的值
    
 	//首先将a1,a2,a3从小到大排序
    
 	if(a1>a2) {
    
 		int tmp = a1;
    
 		a1 = a2;
    
 		a2 = tmp;
    
 	}
    
 	if(a1>a3) {
    
 		int tmp = a1;
    
 		a1 = a3;
    
 		a3 = tmp;
    
 	}
    
 	if(a2>a3) {
    
 		int tmp = a2;
    
 		a2 = a3;
    
 		a3 = tmp;
    
 	}
    
 	//将b1,b2,b3从小到大排序
    
 	if(b1>b2) {
    
 		int tmp = b1;
    
 		b1 = b2;
    
 		b2 = tmp;
    
 	}
    
 	if(b1>b3) {
    
 		int tmp = b1;
    
 		b1 = b3;
    
 		b3 = tmp;
    
 	}
    
 	if(b2>b3) {
    
 		int tmp = b2;
    
 		b2 = b3;
    
 		b3 = tmp;
    
 	}
    
 	minv = a1*b3+a2*b2+a3*b1; //求对应数字相乘求和(a1,a2,a3从小到大,b3,b2,b1从大到小) 
    
 	maxv = a1*b1+a2*b2+a3*b3;//求对应数字相乘求和(a1,a2,a3从小到大,b1,b2,b3从小到大)
    
 	cout<<minv<<' '<<maxv<<endl;
    
 	return 0;
    
 }

通过查看程序可知,在C++语言中用于交换两个数值所需的代码量较大。然而,在C++标准库(包含在头文件#include )中提供了名为swap的标准库函数用于完成这一操作。为了实现数值互换功能,在实际编程过程中通常会进行具体的数值操作。例如为了实现数值互换功能,则需要对变量a和变量b的具体数值进行操作,并且可以通过调用std::swap(a, b)来完成这一功能。因此对于上述代码应优化后即可替换原来的代码段。

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int main() {
    
 	int a1,a2,a3;//定义小明手中的数字变量a1,a2,a3
    
 	int b1,b2,b3;//定义小敏手中的数字变量b1,b2,b3
    
 	int minv,maxv;//定义乘积和的最大值maxv和最小值minv 
    
 	cin>>a1>>a2>>a3;//输入a1,a2,a3的值
    
 	cin>>b1>>b2>>b3;//输入b1,b2,b3的值
    
 	//首先将a1,a2,a3从小到大排序
    
 	if(a1>a2) {
    
 		swap(a1,a2); 
    
 	}
    
 	if(a1>a3) {
    
 		swap(a1,a3);
    
 	}
    
 	if(a2>a3) {
    
 		swap(a2,a3);
    
 	}
    
 	//将b1,b2,b3从小到大排序
    
 	if(b1>b2) {
    
 		swap(b1,b2);
    
 	}
    
 	if(b1>b3) {
    
 		swap(b1,b3);
    
 	}
    
 	if(b2>b3) {
    
 		swap(b2,b3);
    
 	}
    
 	minv = a1*b3+a2*b2+a3*b1; //求对应数字相乘求和(a1,a2,a3从小到大,b3,b2,b1从大到小) 
    
 	maxv = a1*b1+a2*b2+a3*b3;//求对应数字相乘求和(a1,a2,a3从小到大,b1,b2,b3从小到大)
    
 	cout<<minv<<' '<<maxv<<endl;
    
 	return 0;
    
 }

全部评论 (0)

还没有任何评论哟~