CCF 202009-3点亮数字人生 (100分)

(1)题目描述

在这里插入图片描述

(2)算法思想

本题难度其实不大,关键是耐心读题。
首先剖析一下题目的输入顺序以及格式:

1			//要解决的问题数目,本题由多个独立的子问题构成
3 5			//独立问题的电路输入个数以及器件个数
XOR 2 I1 I2	//器件类型、输入个数、每个输入端的编号,I开头表示直接输入,O开头表示器件输入
XOR 2 O1 I3
AND 2 O1 I3
AND 2 I1 I2
OR 2 O3 O4
4			//输入的次数,也即输出的次数
0 1 1		//每次输入时输入信号的状态
1 0 1
1 1 1
0 0 0
2 5 2		//每次输出的器件数量以及对应的器件编号
2 5 2
2 5 2
2 5 2

而输出的要求相对简单,根据独立子问题输入的最后一部分进行相应输出即可。

了解输入输出的格式后便可以开始实现了,思路如下:

  1. 首先接收输入,输入分为多个层次,最高一层为独立子问题的个数,第二层为每个子问题的相应输入,子问题中含有输入变量数量的还需要再分一层。
  2. 接收输入完毕后开始构建电路,我的思路是分层级,输入端为0级,直接接收输入端的为1级,输入端为器件输出端的层级为输入器件的层级+1并且取最大层级,这样进行一层一层的构建即可模拟整个逻辑电路的状态。
  3. 成环判断,这部分我看有人说可以使用拓扑排序,但是本人是个菜鸡算法什么的掌握粗浅,比赛时是使用一种类似判断刷新的方式进行判断的;具体就是记录前一状态每个器件的层级构建完毕状态,等这一轮构建完毕后进行比对,如果完全没有变化即可判断构成环,能用这种方式实现判断也是因为严格的层级构建方式,每一次必然至少会有一个器件得到自己的层级情况,如果使用其他方式进行构建这种方式便不一定适用了。
  4. 电路构建完毕后就可以接受输入端并进行输出了,在接受输入端信号之前需要先按照层级有小到大的顺序进行一次排序,保证每一层输入输出的有序;之后每个层级接受相应输入并进行计算,最后对应编号的器件进行信号输出即可。

不过这里有个比较坑的地方需要注意一下,样例中给的输入端编号的数字部分全部都是个位数,但是测试样例实际上是含有多位数的,在处理字符串时要小心不要只取数字部分的第一个字符导致错误(我会说我因为这个BUG改了一个半小时吗?好吧我承认我是个大傻逼QAQ)

(3)代码实现

#include<map>
#include<vector>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;

struct node {
   
	int id;
	int level;
	int output;
	string type;
	bool iscreated;
	vector<int> input;
	vector<int> idvalid;
	vector<string> inputid;
	node () {
   
		level=-1;
		iscreated=0;
	}
	calculate() {
   
		int ans=input[0];
		if(type=="NOT")
			ans=!input[0];
		else if(type=="AND")
			for(int i=1; i<input.size(); i++)
				ans&=input[i];
		else if(type=="OR")
			for(int i=1; i<input.size(); i++)
				ans|
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用是一段C++代码,用来解析CCF201612-2工资计算问题。这段代码通过计算各种收入范围和税率,然后根据输入的税前工资来计算出税后工资。具体步骤如下: 1. 首先定义了salaryrange数组存储各个收入范围,taxrate数组存储各个税率,以及range数组用来计算各种收入范围。 2. 通过循环计算range数组的值,range[i表示税前工资在salaryrange[i范围内的税后工资。 3. 输入税前工资t后,通过循环找到税前工资所在的收入范围i。 4. 如果i=0,表示税前工资在最低收入范围内,税后工资直接等于税前工资。 5. 如果i不等于0,表示税前工资在其他收入范围内,通过公式s = salaryrange[i-1 + (t - range[i-1]) * 100 / (100 - taxrate[i-1])计算税后工资。 6. 最后输出税后工资s。 根据这段代码的解析,可以计算出CCF201612-2工资计算问题的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CCF201612-2 工资计算(100分)](https://blog.csdn.net/tigerisland45/article/details/54799557)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [CCF201612-2 工资计算](https://blog.csdn.net/qq_40670344/article/details/97441803)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值