【2018/09/22】T2 - dp - 塔

本文详细解析了一道算法题目——构建最优塔。通过分析不同体积积木的使用策略,介绍了如何在限定体积内构建积木数量最多的塔,并找出在该条件下使用的最大体积积木。文章提供了从暴力解法到DP优化的多种解题思路,适合算法初学者及进阶者阅读。

塔(30/100)

描述

小A想搭一个体积不超过m的塔,他有各种大小的立方积木,比如边长为a的积木,体积为a^3,现在小A需要你给一个X,每次小A会用一个体积不超过X的最大积木,依次到搭好为止,现在他想最大化积木的个数,同时在积木个数最大的情况下使X最大

输入

一行一个数m

输出

一行两个数,最多积木数以及x

样例输入

48

样例输出

9
42

提示

【样例解释】 X=23或42都是9次,42 = 3^3 + 2^3 + 7*1^3

【数据范围】

30%:m<=10^5

50%:m<=10^10

100%:m<=10^15

 

【分析】

这个题目描述依旧很鬼畜……大部分同学又没有读懂了(主要是题意没有叙述清楚)

重述:

给定m,请你确定[ 1 , m ]中的 x ,使得用到的积木数最多,每次取积木的原则:取当前可取的最大的那一个。在满足积木数最大的情况下,输出最大的 x 

这下应该清楚一些了吧。

首先30分的暴力:枚举 x (1~m) ,然后挨个判断

50分:dp

100分:在50 分的dp上进行优化

找到最大的 a 使得 a^3 不超过 m,接下来 X 的第一块积木必然为 a 或 a-1 
1.用 a,m2=m-a^3 
2.用 a-1, X最大为 a^3-1, m2 = a^3-1-(a-1)^3=3*(a^2-a) 
3.用 a-2, X最大为(a-1)^3-1,m2 ’ =(a-1)^3-1-(a-2)^3=3*a^2-9a+6 
显然2一定比3优 

 

【代码】

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m;
pair<ll,ll> ans;
ll val[1000009],num=0;
void search(ll x,ll steps,ll ss){
	if(x==0){
		ans=max(ans,make_pair(steps,ss));
		return ;
	}
	ll a=lower_bound(val+1,val+100001,x)-val;//自从学会lower_bound后就再也不想手写二分了
	if(val[a]>x) a--;
	search(x-val[a],steps+1,ss+val[a]);
	if(a-1>=0) search(val[a]-1-val[a-1],steps+1,ss+val[a-1]);
}
int main(){
	scanf("%lld",&m);
	for(int i=1;i<=100000;++i)	val[i]=1ll*i*i*i;
	search(m,0,0);
	printf("%lld %lld",ans.first,ans.second);
	return 0;
}

 

<think>好的,我现在需要解决用户关于PLC交通灯控制逻辑代码的解析和优化请求。首先,用户提到了具体的元件和参数,比如T0到T3的定时器,M0到M2的中间继电器,以及Y0、Y1、Y4、Y5作为输出,还有K值参数。我需要先理解这些元件在典型交通灯控制中的应用。 首先,我应该回忆一下常见的PLC交通灯控制逻辑。通常,交通灯分为东西和南北两个方向,每个方向有红、黄、绿三种灯,循环切换。定时器用来控制每个阶段的持续时间,中间继电器可能用于状态切换或模式控制。用户提到的K值如K100、K50等可能对应同阶段的定时时间,比如绿灯亮50秒,黄灯30秒,红灯20秒?或者需要根据具体代码逻辑来分析。 过用户没有提供具体的代码,所以可能需要做一个通用的解析。例如,T0到T3可能对应四个同的定时阶段,每个阶段控制同的灯组合。M0到M2可能用于控制系统的启动、停止或模式切换。Y0到Y5的输出可能分别控制同方向的信号灯。 接下来,解析部分需要分步骤说明每个元件的作用,比如T0是绿灯时间,T1是黄灯,T2是另一个方向的绿灯,T3是黄灯,然后循环。中间继电器M0可能用于启动系统,M1和M2用于状态保持或切换。输出Y0-Y5对应各个方向的灯,比如Y0为东西绿灯,Y1为东西黄灯,Y4为南北绿灯,Y5为南北黄灯,红灯可能由绿灯和黄灯的状态组合决定,或者有其他输出点。 在优化建议方面,可能需要考虑使用更高效的定时器配置,减少中间继电器的数量以简化逻辑,加入故障检测或紧急模式,使用结构化编程方法比如状态转移图,或者引入时间参数的可调整性,比如通过HMI修改定时值,而无需修改程序。 另外,需要检查用户提供的K值是否合理,比如K100可能对应100个单位时间,需确认时间基数是100ms还是1s,这会直接影响实际持续时间。比如,如果定时器是100ms时基,K100就是10秒,而K50是5秒,这可能与实际交通灯需求符,需要调整时基或K值。 可能还需要考虑互锁逻辑,确保同一方向的绿灯和红灯会同时亮起,避免冲突。同时,黄灯的闪烁控制可能需要使用脉冲发生器或特定指令来实现。 用户可能希望代码结构更清晰,比如使用顺序功能图(SFC)来设计,或者使用子程序封装同的阶段,便于维护和调试。此外,优化可能包括减少扫描周期时间,避免使用过多的定时器同时运行,或者使用比较指令来触发状态切换,而是依赖多个定时器串联。 最后,要确保引用相关的PLC编程实践,比如模块化设计或使用标准化的编程结构,这可能与用户提供的引用内容中的硬件选型考虑相关,比如确保PLC的处理速度足够处理逻辑的实时性要求。</think>### PLC交通灯控制逻辑代码解析 根据您提供的元件配置$T0-T3$、$M0-M2$、$Y0/Y1/Y4/Y5$和参数$K100/K50/K30/K20$,典型控制逻辑可解析为: #### 1. 元件功能定义 - **定时器**: - $T0=K100$:东西绿灯50秒(假设时基0.5s) - $T1=K50$:东西黄灯25秒 - $T2=K30$:南北绿灯15秒 - $T3=K20$:南北黄灯10秒 - **中间继电器**: - $M0$:系统启停控制 - $M1$:东西方向状态锁存 - $M2$:南北方向状态锁存 - **输出端子**: - $Y0$:东西绿灯 - $Y1$:东西黄灯 - $Y4$:南北绿灯 - $Y5$:南北黄灯 - (红灯由反向绿灯激活) #### 2. 典型梯形图结构 ```ladder Network1: 系统启动 | M0 T0 |----| |------(TON)-- Preset K100 Network2: 东西绿灯 | T0 M1 Y0 |----| |-----| |------( )-- Network3: 黄灯转换 | T0 T1 M1 |----|/|-----| |------( )-- | T1 Y1 |----| |-------------( )-- Network4: 南北绿灯 | T1 M2 Y4 |----| |-----| |------( )-- Network5: 黄灯转换 | T3 T2 M2 |----|/|-----| |------( )-- | T3 Y5 |----| |-------------( )-- ``` ### 优化建议 #### 1. 时序控制优化 - 采用**环形计时器结构**减少定时器数量: $$TotalTime = T0+T1+T2+T3 = 120s$$ 使用单个定时器配合比较指令: ```ladder | M0 T4 |----| |------(TON)-- Preset K1200 // 120s*10=1200(0.1s时基) | T4<200 Y0 // 0-20s东西绿灯 |----| |------( )-- | T4<500 Y1 // 20-50s东西黄灯 |----| |------( )-- ``` #### 2. 安全互锁强化 - 增加方向互锁: ```ladder | Y0 Y4 |----| |-----|/|------( )-- // 禁止同时绿灯 ``` #### 3. 模式扩展 - 添加紧急模式: ```ladder | X0 MOV K9999 T4 // 强制红灯模式 |----| |-----|MOV|---------- ``` #### 4. 参数可配置化 使用数据寄存器代替直接常数: ```ladder | MOV D0 T4.Preset // D0存储总周期时间 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值