第15次CCF CSP真题解

1、小明上学

题目链接:https://sim.csp.thusaac.com/contest/15/problem/0

本题是模拟红绿灯计时的题,根据红绿灯转换规则可知,红灯后面通常是绿灯,绿灯后面是黄灯,黄灯过后又是红灯。根据题意,当k = 0时,表示小明经过一段道路,此时进行计时操作;当k = 1时,表示小明看到了一个红灯,此时进行计时操作;当k = 2时,表示小明看到了一个黄灯,此时计时操作包括黄灯和红灯的计时;当k = 3时,表示小明看到了一个绿灯,此时可以直接通过,不用进行计时操作。

100分代码:

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
	int r,y,g;
    cin >> r >> y >> g; 
    
	int n;
	cin >> n;
	
	int k[110],t[110];
	for(int i = 0; i < n; i++){
		cin >> k[i] >> t[i];
	}
	
	int sum = 0;
	for(int i = 0; i < n; i++){
		if(k[i] == 0 || k[i] == 1)sum += t[i];
		else if(k[i] == 2)sum += t[i] + r;
	}
	cout << sum << endl;
	
	return 0;
}

评测结果:

2、小明放学

题目链接:https://sim.csp.thusaac.com/contest/15/problem/1

本题难度比第一题增加了不少,小明在放学时已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。当经过一段道路时,进行计时操作即可。当经过红绿灯时,需要考虑红绿灯转换的周期问题,红灯、黄灯和绿灯都亮过后算一个周期,具体的周期转换情况如下图所示:

情况1
tgyrgyrgyrgy
5303303033030330303
绿绿绿绿
等待通过等待等待通过等待等待通过等待等待通过等待
情况2
trgyrgyrgyrg
23030330303303033030
绿绿绿绿
等待等待通过等待等待通过等待等待通过等待等待通过
情况3
tyrgyrgyrgyr
10330303303033030330
绿绿绿绿
通过等待等待通过等待等待通过等待等待通过等待等待

对于红绿灯周期转换过程中的计时问题,可以运用求模运算解决。

如果不会正解的话,可以根据测试点拿分,前 2 个测试点中不存在任何信号灯,所以只需在经过每一段道路时进行计时操作即可,轻轻松松20分就到手了。

20分代码:

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
	int r,y,g;
	cin >> r >> y >> g;
	
	int n;
	cin >> n;
	
	int k,t;
	long long sum = 0;
	for(int i = 1; i <= n; i++){
	    cin >> k >> t;
		sum += t;	
	}
	cout << sum << endl; 
	
	return 0;
}

评测结果:

100分代码:

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
	int r,y,g;
	cin >> r >> y >> g;
	
	int n;
	cin >> n;
	
	int k,t;
	long long sum = 0;
	for(int i = 1; i <= n; i++){
	    cin >> k >> t;
		if(k == 0)sum += t;	
		else if(k == 1){
		  if(sum < t + g + y){
		     if(sum % (t + g + y) < t)sum += t - sum % (t + g + y);
		     else if(sum % (t + g + y) >= t && sum % (t + g + y) < t + g)sum += 0;
		     else if(sum % (t + g + y) >= t + g && sum % (t + g + y) < t + g + y)sum += t + g + y + r - sum % (t + g + y);	
		  }
		  else if(sum >= t + g + y){
		     if((sum - (t + g + y)) % (r + g + y) < r)sum += r - (sum - (t + g + y)) % (r + g + y);
		     else if((sum - (t + g + y)) % (r + g + y) >= r && (sum - (t + g + y)) % (r + g + y) < r + g)sum += 0;
		     else if((sum - (t + g + y)) % (r + g + y) >= r + g && (sum - (t + g + y)) % (r + g + y) < r + g + y)sum += r + g + y + r - (sum - (t + g + y)) % (r + g + y);	
		   }
		}
		else if(k == 2){
		  if(sum < t + r + g){
		     if(sum % (t + r + g) < t)sum += t + r - sum;
		     else if(sum % (t + r + g) >= t && sum % (t + r + g) < t + r)sum += t + r - sum % (t + r + g);	
		     else if(sum % (t + r + g) >= t + r && sum % (t + r + g) < t + r + g)sum += 0;	
		  }
		  else if(sum >= t + r + g){
		     if((sum - (t + r + g)) % (y + r + g) < y + r)sum += y + r - (sum - (t + r + g)) % (y + r + g);
		     else if((sum - (t + r + g)) % (y + r + g) >= y + r && (sum - (t + r + g)) % (y + r + g) < y + r + g)sum += 0;	
		  }
		}
		else if(k == 3){
          if(sum < t + y + r){
             if(sum % (t + y + r) < t)sum += 0;
             else if(sum % (t + y + r) >= t && sum % (t + y + r) < t + y + r)sum += t + y + r - sum % (t + y + r);	
          }
          else if(sum >= t + y + r){
             if((sum - (t + y + r)) % (g + y + r) < g)sum += 0;
             else if((sum - (t + y + r)) % (g + y + r) >= g && (sum - (t + y + r)) % (g + y + r) < g + y + r)sum += g + y + r - (sum - (t + y + r)) % (g + y + r);	
          }
		}
	}
	cout << sum << endl; 
	
	return 0;
}

评测结果:

关于 CCF CSP 认证第35考试的 Python 题目解答或解析,目前并未提供具体的引用材料来支持这一请求。然而,可以基于以往的经验和类似的题目类型给出一般性的指导。 ### 关于CCF CSP认证 CCF CSP(软件能力认证)是一项评估个人编程能力和解决问题能力的测试[^2]。该认证通常包含多道编程题,考察的内容涵盖了基本的数据结构算法设计以及程序实现的能力。 ### 如何准备CSP认证? 对于参加此类认证考试的学生或者开发者来说,熟悉常见的算法模式是非常重要的。比如: - 掌握数组操作的基础方法。 - 学习并熟练运用诸如栈、队列这样的基础数据结构。 - 对字符串处理有深入的理解,能够快速编写正则表达式匹配逻辑。 以下是针对可能出现在CSP中的典型问题的一个通用解决方案框架: #### 示例:矩阵转置 假设有一道类似于矩阵重塑的问题,这里展示如何通过Python实现矩阵转置的功能作为例子: ```python def transpose(matrix): rows = len(matrix) cols = len(matrix[0]) if matrix else 0 transposed = [[matrix[row][col] for row in range(rows)] for col in range(cols)] return transposed # 测试代码 input_matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] result = transpose(input_matrix) for r in result: print(r) ``` 上述代码实现了简单的二维列表(即矩阵)转置功能[^3]。 ### 提升答题技巧 为了更好地应对像CSP这样严格的评测环境,在日常练习中应该注重以下几个方面: - **时间复杂度优化**:确保所写的函数尽可能高效运行。 - **边界条件考虑全面**:注意输入为空或其他极端情况下的行为定义。 - **可读性强**:即使追求效率也不能牺牲代码清晰性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值