CCF [201812-1] 小明上学(C++)√

该博客介绍了如何计算小明在上学途中遇到红绿灯时的总耗时,包括道路耗时和等待红绿灯的时间。通过读取输入的红绿灯设置和道路段信息,可以得出小明的总上学时间。解题策略是根据信号灯的状态添加相应的时间到总耗时中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试题编号: 201812-1
试题名称: 小明上学
时间限制: 1.0s
内存限制: 512.0MB
题目背景:
  小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿灯。
  京州市的红绿灯是这样工作的:每盏红绿灯有红、黄、绿三盏灯和一个能够显示倒计时的显示牌。假设红绿灯被设定为红灯 r 秒,黄灯 y 秒,绿灯 g 秒,那么从 0 时刻起,[0,r) 秒内亮红灯,车辆不许通过;[r, r+g) 秒内亮绿灯,车辆允许通过;[r+g, r+g+y) 秒内亮黄灯,车辆不许通过,然后依次循环。倒计时的显示牌上显示的数字 l(l > 0)是指距离下一次信号灯变化的秒数。
问题描述:
  一次上学的路上,小明记录下了经过每段路的时间,和各个红绿灯在小明到达路口时的颜色和倒计时秒数。希望你帮忙计算此次小明上学所用的时间。
输入格式:
  输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
  输入的第二行包含一个正整数 n(n ≤ 100),表示小明总共经过的道路段数和看到的红绿灯数目。
  接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
输出格式:
  输出一个数字,表示此次小明上学所用的时间。
样例输入:
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
样例输出:
70
样例说明:
  小明先经过第一段道路,用时 10 秒,然后等待 5 秒的红灯,再经过第二段道路,用时 11 秒,然后等待 2 秒的黄灯和 30 秒的红灯,再经过第三段、第四段道路,分别用时6、3秒,然后通过绿灯,再经过最后一段道路,用时 3 秒。共计 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。
评测用例规模与约定:
  测试点 1, 2 中不存在任何信号灯。
  测试点 3, 4 中所有的信号灯在被观察时均为绿灯。
  测试点 5, 6 中所有的信号灯在被观察时均为红灯。
  测试点 7, 8 中所有的信号灯在被观察时均为黄灯。
  测试点 9, 10 中将出现各种可能的情况。

解题思路:
  一个简单的序列处理问题。k=0、k=1时加上t,k=2时加上t+r,k=3时加上0。

答案程序:

//程序1
#include<iostream>
using namespace std;

int main(){
	int r,y,g,n,time=0;
	cin>>r>>y>>g;
	cin>>n;

	int k[n],t[n];
	for(int i=0;i<n;i++){
    	cin>>k[i]>>t[i];
    	if(k[i]==0){
    		time+=t[i];
		}
		else if(k[i]==1){
			time+=t[i];
		}
		else if(k[i]==2){
			time+=t[i]+r;
		}
		else if(k[i]==3){
			time+=0;
		}
	}
	cout<<time<<endl;
	return 0;
}

改进后的程序:
(1)改变了k、t的接收方式,由数组变为int类型变量直接接收;
(2)对k=0、k=1两种情况进行了合并;

//程序2
#include<iostream>
using namespace std;

int main(){
	int r,y,g,n,k,t,time=0;
	cin>>r>>y>>g;
	cin>>n;

	while(n--){//输入终止条件判断,不用while(cin>>k>>t) 
		cin>>k>>t;
		if(k==0||k==1){
    		time+=t;
		}
		else if(k==2){
			time+=t+r;
		}
		else if(k==3){
			time+=0;
		}
	}
	cout<<time<<endl;

	return 0;
}

结果1:
在这里插入图片描述
结果2:
在这里插入图片描述

题目内容:小明同学特别喜欢买书看书。由于书较多,摆放杂乱,找起来非常麻烦。这学期小明同学上了数据结构与程序设计课后,决定改变这种状况:用C开发一个小型图书管理系统。系统中包含的图书信息有:书名、作者、出版社、出版日期等。首先,图书管理系统对已有的书(原始书库,存放在一个文本文件中)按书名字典序进行(按书名中各字符的ASCII码值由小到大排序)摆放(即将原始无序的图书信息文件生成一个有序的文件,即新书库),以便查找。该管理系统可以对新书库中图书条目进行如下操作: 1.录入。新增书录入到书库中(即从输入中读入一条图书信息插入到已排序好的图按书文件相关位置处) 2.查找。按书名或书名中关键字信息在书库中查找相关图书信息,若有多本书,按字典序输出。 3.删除。输入书名或书名中关键字信息,从书库中查找到相关书并将其删除,并更新书库。 【输入形式】 原始的图书信息(原始书库)保存在当前目录下的books.txt中。 用户操作从控制台读入,首先输入操作功能序号(1代表录入操作,2代表查找操作,3代表删除操作,0代表将已更新的图书信息保存到书库中并退出程序),然后在下一行输入相应的操作信息(录入操作后要输入一条图书信息,查找和删除操作后只要输入书名或书名中部分信息)。程序支行过程中可以进行多次操作,直到退出(输入操作0)程序。 要求: 1、原始文件中的图书信息与录入的图书信息格式相同,每条图书信息都在一行上,包括书名(不超过50个字符)、作者(不超过20个字符)、出版社(不超过30个字符)和出版日期(不超过10个字符),只由英文字母和下划线组成,用一个空格分隔。图书信息总条数不会超过500. 2、下划线字符参加排序。 3、图书不会重名。 【输出形式】 进行录入和删除操作,系统会更新图书信息,但不会在控制台窗口显示任何信息。 进行查找操作后,将在控制台按书名字典序分行输出查找到的图书信息,书名占50个字符宽度,作者占20个字符宽度,出版社占30个字符宽度,出版日期占10个字符宽度,都靠左对齐输出。 最终按字典排序的图书信息保存在当前目录下的ordered.txt中,每条图书信息占一行,格式与查找输出的图书信息相同
201812-2小明放学的问题是关于小明利用“智慧光明”终端给出的信息,估算自己放学回家的时间。在这道题目中,小明已经规划好了回家的路线,并能够预测经过各个路段的时间。此外,小明还能够看到出发时刻路上经过的所有红绿灯的指示状态。根据题目的描述,我们可以推导出小明此次回家所需要的时间。 首先,题目给出了红绿灯的设置,包括红灯、黄灯和绿灯分别需要的时间。接下来,题目给出了小明经过的道路段数和路过的红绿灯数目。然后,题目给出了每个道路段和红绿灯的状态,包括经过的道路需要的时间和红绿灯的状态以及倒计时显示的数字。 根据题目的要求,我们需要不断地推演现在的时间下新经过的红绿灯状态。可以将红灯和黄灯放在一起,因为这两个状态下都得等待,然后将绿灯状态单独分开。这样就将问题简化为两个区间,即红黄和绿。通过计算每个区间所需的时间,就可以得到小明放学回家所用的总时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [CCF 201812-2----小明放学----区间问题](https://blog.youkuaiyun.com/weixin_44778155/article/details/101158855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值