1 第 3 章 C++ 中的条件与循环 第 3 次见面! acm.nefu.edu.cn/C++_03.ppt.

Slides:



Advertisements
Similar presentations
1 第二讲 C++ 编程基础. 2 主要内容 C++ 语言概述 C++ 编程基础 数据的简单输入输出 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境.
Advertisements

While 迴圈 - 不知重複執行次數
CSIM, PU C Language Introduction to the C Programming Language 重覆敘述 (for,while,break,continue) 適合重複性的計算或判斷.
程序设计实习 3月份练习解答
财经法规与会计职业道德 (3) 四川财经职业学院.
第二章 JAVA语言基础.
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
C++程序设计 王希 图书馆三楼办公室.
程式設計實作.
資料大樓 --談指標與陣列 綠園.
函數(一) 自訂函數、遞迴函數 綠園.
C++Primer 3rd edition 中文版 Chap 5
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
C++程序设计 第二讲 清华大学软件学院.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
程式撰寫流程.
计算机网络讲义 第5章 批量数据处理—数组 一维数组 排序和查找 二维数组 字符串.
作弊是否很有诱惑性? 上堂课已经讲了 作业不一定在两个小时里都能完成 答疑没有一个人? 作弊是有记录的 心理系很多同学集体作弊,让人震惊
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
C++程序设计 string(字符串类) vector(容器类).
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
C++语言程序设计 第二章 C++简单程序设计.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
計數式重複敘述 for 迴圈 P
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第2章 C++流程控制语句 if 语句 switch语句 for语句 while语句 do - while语句 break语句
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第六节 最小生成树.
第二章Java基本程序设计.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
第三章 C++的语句和简单的程序设计 主要内容:
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
程式的時間與空間 Time and Space in Programming
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++程式設計入門 變數與運算子 作者:黃建庭.
第三章 程序的控制结构 第一节 概述 第二节 if选择结构 第三节 switch语句.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
隨機數 (亂數) 10後,取餘數 n = rand(); 利用 Code::Block 驗證一下 n = rand() %10; 998
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
第七章  数 组.
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第6章 PHP基本語法介紹.
變數與資料型態  綠園.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第二章 Java基础语法 北京传智播客教育
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
函式庫補充資料 1.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

1 第 3 章 C++ 中的条件与循环 第 3 次见面! acm.nefu.edu.cn/C++_03.ppt

2 这 2 天你们 C++ 吗? 一夜北风寒,万里彤云厚; 长空雪乱飘,改尽江山旧。 仰面观太虚,疑是玉龙斗; 纷纷鳞甲飞,顷刻遍宇宙。 骑驴过小桥,独叹梅花瘦! 谁知道出自 ? 是 李白 吗?

上次实验课总结 1 、注意汉字和英文的输入法; 2 、 endl 不是 end1; 3 、时时刻刻使用 C++ 的基本框架 3

上机调试的心得(授之以渔) 1 、哪行出错了 2 、提示的字符是啥 3 、是不是自己敲错了 4 、缺头文件吗? was not declared in this scope 5 、结构,大括号,大小写 6 、然后才是真的逻辑出错了 4

先学习 C++ 实验的在线评测系 统 记住网址: acm.nefu.edu.cn 5

6

注册 register 7

Problem 题目 8

如何做题 先看题,如 “ 寻找吕布 ” 这题; description 三国里面吕布第一,赵云第二,典韦、 关羽和马超分别是第 3 、第 4 和第 5 名,这 是按武将的勇猛值和必杀技值的和来排 名的,即武术值 = 勇猛值 + 必杀技值,下 面给出这 5 人的勇猛值和必杀值,请你找 出吕布的武术值。 9

寻找吕布 input 输入数据有多组,每组数据 2 行,第一行 是 5 人的勇猛值,第二行是 5 人的必杀技 值。勇猛值和必杀值是整数哦( 32 位) output 输出吕布的武术值。 10

sample_input sample_output hint 吕布的勇猛值和必杀技值都是第一的! 11

#include using namespace std; int main() { int data[6],inp[6];// 定义变量 int ym,bs;// 勇猛值 必杀值的变量 while(cin>>data[1]>>data[2]>>data[3]>>data[4]>>data[5])// 注意 { ym=0,bs=0; // 这句很重要,必须先清 0 for(int i=1;i<=5;i++) if (ym<data[i]) ym=data[i]; cin>>inp[1]>>inp[2]>>inp[3]>>inp[4]>>inp[5]; for(int i=1;i<=5;i++) if (bs<inp[i]) bs=inp[i]; cout<<ym+bs<<endl; } //cout << “Hello world!” << endl; 记得要注视掉啊 return 0; } 12

再看服务器里的数据 data.in 输入文件 data.out 输出文件 你不知道服务器的数据是啥! 13

提交答案 : 题目下面 submit 14

看评判结果 15

欢迎有敏感的人加入 ACM 数学好 算法好(可以培养) 能吃苦就行 16

条件语句 if switch 和 C 语言一样,基本知识不变 通过实例来讲解 17

条件表达式 ?:运算符 :问号冒号运算符 作用:更加简练的用来表达条件执行的方式 形式 : ( 条件 ) ? 表达式 1 : 表达式 2 执行过程:首先计算条件值。如果条件结果为 true ,则计算表达式 1 的值,并将它作为整个表 达式的值。如果条件结果为 false ,则整个表达 式的值为表达式 2 的值。

实例 例如将 x 和 y 中值较大的一个赋值给 max ,可以用下列语句: max = (x > y) ? x : y; ?:运算符用于输出。例如,想输出一个布尔变量 flag 的值, 如果直接用 cout << flag; 那么当 flag 为 “ 真 ” 时,输出为 1 ;当 flag 为 “ 假 ” 时,输出为 0 。 如果我们想让 flag 为 “ 真 ” 时输出 true ,为 “ 假 ” 时输出 false ,可以 用 if 语句 if (flag) cout << “true”; else cout << “false”; 看上去太罗嗦。但如果用?:运算符只需要一行 cout << ( flag ? "true" : "false" ) << endl;

判断闰年的程序 #include using namespace std; int main() { int year; bool result; cout << " 请输入所要验证的年份: "; cin >> year; result = (year % 4 == 0 && year % 100 !=0)|| year % 400 == 0; if (result) cout << year << " 是闰年 " << endl; else cout << year << " 不是闰年 " << endl; return 0; }

计算机自动出四则运算计算题 生成题目 Switch( 题目类型 ) { case 加法:显示题目,输入和的值,判断正确与否 case 减法:显示题目,输入差的值,判断正确与否 case 乘法:显示题目,输入积的值,判断正确与否 case 除法:显示题目,输入商和余数的值,判断正确与否 } 要求自动出 之间的四则运算题,并批改结果

关键问题 如何让程序每次执行的时候都出不同的题目? 随机数生成器 rand() :能随机生成 0 到 RAND_MAX 之间的整型数 将生成的随机数映射到 之间: –Rand() % 10 –rand() * 10 / (RAND_MAX + 1) 。 运算符的生成:用编码 表示四个运算符。因 此题目的生成就是生成 之间的随机数。

随机数的种子 计算机产生的随机数称为伪随机数,它是根据一个 算法计算出来的。 系统为每个程序、每次执行指定的随机数的种子都 是相同的,因此程序每次执行生成的随机数序列都 是相同的。 rand() 种子 12348

改变随机数的种子 设置种子的函数 srand : srand (种子) 如何让程序每次执行时选择的种子都不一 样呢 ? 选择系统时间为种子: time(NULL) 取当前 的系统时间。

#include // 包含伪随机数生成函数 #include // 包含取系统时间的函数 #include using namespace std; int main() { int num1, num2, op, result1, result2; //num1,num2: 操作数, op: 运算符, result1,result2: 结果 srand(time(NULL)); // 随机数种子初始化 num1=rand() * 10 / (RAND_MAX + 1); // 生成运算数 RAND_MAX=32767 num2=rand() * 10 / (RAND_MAX + 1); // 生成运算数 op=rand() * 4 / (RAND_MAX + 1); // 生成运算符 0--+ , , 2--* , 3-- / 自动出题程序

switch (op) {case 0: cout > result1; if (num1 + num2 == result1) cout << "you are right\n"; else cout << "you are wrong\n"; break; case 1: cout > result1; if (num1 - num2 == result1) cout << "you are right\n"; else cout << "you are wrong\n"; break; case 2: cout > result1; if (num1 * num2 == result1) cout << "you are right\n"; else cout << "you are wrong\n"; break;

case 3: cout << num1 << "/" << num2 << "= ?" ; cin >> result1; cout > result2; if ((num1 / num2 == result1) && (num1 % num2 == result2)) cout << "you are right\n"; else cout << "you are wrong\n"; break; } return 0; }

该程序的缺陷 每次执行只能出一道题 减法可能出现负值 除法可能出现除 0 结果太单调

再看循环结构 For 基本的习惯 While 用处 Do while 29

For 循环实例 某班级有 100 个学生,设计一程序统计该班 级某门考试成绩中的最高分、最低分和平 均分。 方案一:先输入 100 个整型数,保存在各自 的变量中。然后依次检查这 100 个数,找出 最大的和最小的。在找的过程中顺便可以 把所有的数都加起来。最后将总和除 100 就 得到了平均值。

方案一的缺陷 需要定义 100 个变量 需要输入 100 个变量的值 从 100 个变量中找出最大者,需要 100 个 if 语句 从 100 个变量中找出最小者,需要 100 个 if 语句 将这 100 个变量加起来需要一个长长的算 术表达式

方案二 每个学生的分数在处理过后就没用了, 为此,可以用一个变量保存当前正在处 理的分数 每次输入分数的同时将它们加起来: 70 加 40 等于 110 , 110 加 80 等于 190…… 。并 记住最低分的和最高分的值。上述过程 重复 100 次。

方案二的实现 定义: int value, total , max, min; 当输入每个数值时必须执行下面的步骤,这可 以用 for 循环实现 – 请求用户输入一个整数值,将它存储在变量 value 中 。 – 将 value 加入到保存当前和的变量 total 中。 – 如果 value 大于 max ,将 value 存于 max 。 – 如果 value 小于 min ,将 value 存于 min 。

#include using namespace std; int main() { int value, total, max, min, i;//value :当前输入数据, i 为循环变量 total = 0; max = 0; min = 100; // 变量的初始化 for (i=1; i<=100; ++i) { cout > value; total += value; if (value > max) max = value; if (value < min) min = value; } cout << "\n 最高分: " << max << endl; cout << " 最低分: " << min << endl; cout << " 平均分: " << total / 100 << endl; return 0; }

For 循环实例 求函数 在区间 [a, b] 之间的定积分 实现思想:函数与 x 轴围成的区域的面积。定积分 可以通过将这块面积分解成一连串的小矩形,计算 各小矩形的面积的和而得到 ab

int main() { double a, b, dlt, integral = 0; cout << " 请输入定积分的区间: " ; cin >> a >> b; cout << " 请输入小矩形的宽度: " ; cin >> dlt; for (double x = a + dlt / 2; x < b; x += dlt) integral += (x * x + 5 * x + 1) * dlt; cout << " 积分值为: " << integral << endl; return 0; }

eg 2. 求时结束 。 ex=0; p = 1; while (p> ) { ex += p; 计算新的 p ; } 问题: 如何计算 p ?计算第 i 个 p ,需 要两个 i 次的循环。第一个循 环计算 x i ,第二个循环计算 i ! 解决方案: 从前一项计算后一项。如果 p 是第 i 项的值,则第 i+1 项的值 为 p*x/(i+1)

int main() {double ex, x, p;//ex 存储 e x 的值, p 保存当前项的值 int i; cout > x; ex=0; p=1; i=0; while (p > 1e-6){ ex += p; ++i; p = p * x / i; } cout << "e 的 " << x << " 次方等于: " << ex << endl; return 0; }

枚举法 对所有可能的情况一种一种去尝试,直 到找到正确的答案。 枚举法的实现基础是循环。

枚举法实例一 用 50 元钱买了三种水果。各种水果加起来一共 100 个。西瓜 5 元一个,苹果 1 元一个,桔子 1 元 3 个,设计一程序输出每 种水果各买了几个 它有两个约束条件: – 第一是三种水果一共 100 个; – 第二是三种水果一共花了 50 元 可以按一个约束条件列出所有可行的情况,然后对每个可 能解检查它是否满足第二个约束条件 。也可以用第二个约 束条件列出所有情况,然后对每个可能解检查它是否满足 第一个约束条件 。

#include using namespace std; int main() { int mellon, apple, orange; // 分别表示西瓜数、苹果数和桔子数 for (mellon=1; mellon<10; ++mellon) // 对每种可能的西瓜数 for ( apple=1; apple < * mellon; ++apple) { // 当西瓜数给定后可能的苹果数 orange = 3*(50-5*mellon-apple); // 剩下的钱全买了桔子 if (mellon+apple+orange == 100){ // 三种水果数之和是否为 100 cout << "mellon:" << mellon << ' '; cout << "apple:" << apple << ' '; cout << "orange:" << orange << endl; } return 0; }

执行结果 Mellon : 1 apple : 18 orange : 81 Mellon : 2 apple : 11 orange : 87 Mellon : 3 apple : 4 orange : 93

实例二 — 四大湖问题 上地理课时,四个学生回答我国四大湖的大小时分别说 : 甲:洞庭最大,洪泽最小,鄱阳第三 乙:洪泽最大,洞庭最小,鄱阳第二,太湖第三 丙:洪泽最小,洞庭第三 丁:鄱阳最大,太湖最小,洪泽第二,洞庭第三 对于每个湖的大小,每个人仅答对一个,设计一程序让 计算机通过这些信息去判别四个湖的大小。

解题思路 如果用 a,b,c,d 分别表示四个湖的排序。 a 表示洞庭湖, b 表示洪泽湖, c 表示鄱阳湖, d 表示太湖。我们可以假 设:洞庭最大,洪泽第二,鄱阳第三,太湖第四,然 后检查每位同学是否都讲对了一个。如果不是,再尝 试下一种情况:洞庭最大,洪泽第二,鄱阳第四,太 湖第三,再检查每位同学是否都讲对了一个。尝试所 有可能的情况,直到满足每位同学都讲对一个为止。

枚举法 — 续 为了尝试所有情况,我们需要假设洞庭 湖可能是最大,也可能是第二、第三或 第四。因此, a 的值可能从 1 变到 4 。同样 , b, c,d 的值也都可能从 1 变到 4 。为此, 我们需要一个控制结构,使 a, b, c, d 的值 能自动从 1 变到 4 。这种结构就是循环结 构。

四大湖排列问题的解 main() { int a, b, c, d; for (a=1; a<=4; ++a) for (b=1; b<=4; ++b) if ( a == b) continue; else for (c=1; c<=4; ++c) if (c==a||c==b) continue; else {d=10 – a – b - c; if (((a==1)+(b==4)+(c==3))==1 &&((b==1)+(a==4)+(c==2)+(d==3))==1 &&((b==4)+(a==3))==1 &&((c==1)+(d==4)+(b==2)+(a==3))==1) cout << a << b << c << d; } 问题:效率差 解决方法:一旦找到答案 就应该结束

main() { int a, b, c, d; bool flag = false; for (a=1; a<=4; ++a) { for (b=1; b<=4; ++b) { if ( a == b) continue; else for (c=1; c<=4; ++c) if (c==a||c==b) continue; else {d=10 – a – b - c; if (((a==1)+(b==4)+(c==3))==1 // 注意 &&((b==1)+(a==4)+(c==2)+(d==3))==1 &&((b==4)+(a==3))==1 &&((c==1)+(d==4)+(b==2)+(a==3))==1) { cout << a << b << c << d; flag = true; break; } } if (flag) break;} } //break 只能退出当前循环体 改进版 1 : 程序不够简练

main() { int a, b, c, d; bool flag = false; for (a=1; a<=4 && !flag; ++a) { for (b=1; b<=4 && !flag; ++b) { if ( a == b) continue; else for (c=1; c<=4 ; ++c) if (c==a||c==b) continue; else {d=10 – a – b - c; if (((a==1)+(b==4)+(c==3))==1 &&((b==1)+(a==4)+(c==2)+(d==3))==1 &&((b==4)+(a==3))==1 &&((c==1)+(d==4)+(b==2)+(a==3))==1) { cout << a << b << c << d; flag = true; break; } } 改进版 2

列出 ABC 三个字母的全排列 解题思路: – 让第一个位置的值从 A 依次变到 C – 注意三个位置的值不能相同 可以用一个三层的嵌套循环实现,循环变量是 字符类型

int main() { char c1, c2, c3; for (c1 = ‘A’; c1 <= ‘C’; ++c1) for (c2 = ‘A’; c2 <= ‘C’; ++c2) if (c1 == c2) continue; else for (c3 = ‘A’; c3 <= ‘C’; ++c3) if ((c3 == c1 || c3 == c2)) continue; else cout << c1 << c2 << c3 << endl; }

贪婪法的基本思想 在求解过程的每一步都选取一个局部最优 的策略,把问题规模缩小,最后把每一步 的结果合并起来形成一个全局解。 基本步骤: – 从某个初始解出发 – 采用迭代的过程,当可以向目标前进一步时, 就根据局最优策略,得到一个部分解,缩小问 题规模。 – 将所有解综合起来

硬币找零问题 对于一种货币,有面值为 1 分, 2 分, 5 分和 1 角的硬币,最少需要多少个硬币来找出 K 分钱的零钱。

贪婪法解题思想 不断地使用面值最大的硬币。如要找零 的值小于最大的硬币值,则尝试第二大 的硬币。依此类推。 不断尝试的过程就是循环

#include using namespace std; #define ONEFEN 1 #define TWOFEN 2 #define FIVEFEN 5 #define ONEJIAO 10 int main() { int money; int onefen = 0, twofen = 0, fivefen = 0, onejiao = 0; cout << " 输入要找零的钱(以分为单位): "; cin >> money;

// 不断尝试每一种硬币 while (money >= ONEJIAO) {onejiao++; money -= ONEJIAO;} while (money >= FIVEFEN) {fivefen++; money -= FIVEFEN;} while (money >= TWOFEN) {twofen++; money -= TWOFEN;} while (money >= ONEFEN) {onefen++; money -= ONEFEN;} // 输出结果 cout << "1 角硬币数: " << onejiao << endl; cout << "5 分硬币数: " << fivefen << endl; cout << "2 分硬币数: " << twofen << endl; cout << "1 分硬币数: " << onefen << endl; return 0; }

例:用贪心法求解付款问题。 假设有面值为 5 元、 2 元、 1 元、 5 角、 2 角、 1 角的货币,需 要找给顾客 4 元 6 角现金,为使付出的货币的数量最少,首 先选出 1 张面值不超过 4 元 6 角的最大面值的货币,即 2 元, 再选出 1 张面值不超过 2 元 6 角的最大面值的货币,即 2 元, 再选出 1 张面值不超过 6 角的最大面值的货币,即 5 角,再选 出 1 张面值不超过 1 角的最大面值的货币,即 1 角,总共付出 4 张货币。

在付款问题每一步的贪心选择中,在不超过应付款 金额的条件下,只选择面值最大的货币,而不去考虑在 后面看来这种选择是否合理,而且它还不会改变决定: 一旦选出了一张货币,就永远选定。付款问题的贪心选 择策略是尽可能使付出的货币最快地满足支付要求,其 目的是使付出的货币张数最慢地增加,这正体现了贪心 法的设计思想。

思考题 Nefu 90 题 今年暑假不 AC

“ 今年暑假不 AC ? ” “ 是的。 ” “ 那你干什么呢? ” “ 看世界杯呀,笨蛋! ” ” 确实如此,世界杯来了,球迷的节日也来了,估计很多 ACMer 也 会抛开电脑,奔向电视了。 作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的 好青年,你一定还会看一些其它的节目,比如新闻联播(永远不 要忘记关心国家大事)、非常 6+7 、超级女生,以及王小丫的《 开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的 转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目 )

Input 输入数据包含多个测试实例,每个测试实例的第一行 只有一个整数 n(n<=100) ,表示你喜欢看的节目的总数 ,然后是 n 行数据,每行包括两个数据 Ti_s,Ti_e (1<=i<=n) ,分别表示第 i 个节目的开始和结束时间,为 了简化问题,每个时间都用一个正整数表示。 n=0 表示 输入结束,不做处理。 Output 对于每个测试实例,输出能完整看到的电视节目的个 数,每个测试实例的输出占一行。

输入: 输出: 5

先按结束时间排下序(从小到大) 竖着看! 用心一算: 本题可以冒泡

int main() { int tmp,n,s,e,l[5],w[5]; n=4; for(int i=1;i<=4;i++ ) {cin>>l[i]; cin>>w[i];} for(int i=1;i<n;i++) // 这是对 2 个数组的冒泡,先排第 1 个位置,最小的 {tmp=i; for(int j=i+1;j<=n;j++) if (l[j]<l[tmp]) tmp=j; s=l[i];l[i]=l[tmp];l[tmp]=s; // 看好 e=w[i];w[i]=w[tmp];w[tmp]=e; // 跟着拍了 } for(int i=1;i<=4;i++ ) { cout<<l[i]<<" "<<w[i]<<endl; } return 0; } 63

64

暑假不 AC 的贪婪代码 #include using namespace std; int main() { int n; int inp_s[100],inp_e[100];// 开始,结束 2 个数组 int s_tmp,e_tmp; while(cin>>n) { if (n==0) break; for(int i=1;i<=n;i++) cin>>inp_s[i]>>inp_e[i]; 65

// 排序 int tmp=0; for(int i=1;i<=n-1;i++) { tmp=i; for(int j=i+1;j<=n;j++) if (inp_e[j]<inp_e[tmp]) tmp=j; e_tmp=inp_e[i],inp_e[i]=inp_e[tmp],inp_e[tmp]=e_tmp; s_tmp=inp_s[i],inp_s[i]=inp_s[tmp],inp_s[tmp]=s_tmp; } 66

输出结果 int sum=0; tmp=inp_e[1]; for(int i=2;i<=n;i++) { if (tmp<=inp_s[i]) {sum++; tmp=inp_e[i];} } cout<<sum+1<<endl; } //cout << "Hello world!" << endl; return 0; } 67

课后一定要练习之! 68