P1220 关路灯

该博客主要讨论了一个关于优化路径以最小化电力消耗的问题。在给定的N盏灯中,每盏灯都有特定的位置和功率,并且每秒钟会消耗相应电量。你位于某盏灯的位置,需要关闭所有灯,目标是最小化行走和关闭灯过程中的总电量消耗。通过动态规划的方法,定义了两个状态变量来表示区间内灯的状态,并利用前缀和维护来优化转移过程,最终求出最小电量。代码中展示了具体的实现细节。

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

题目链接

点我跳转

题目大意

共有 N 盏灯,第 \(i\) 盏灯的位置为 \(pi\)(单位 \(m\)),功率为 \(si\)

一开始所有灯都是亮的,且第 \(i\) 盏灯每亮一秒钟,就会消耗 \(si\) 的电量

现你位于第 \(c\) 盏灯的位置 , 你需要关闭所有的灯,问关闭所有灯需要消耗的最少电量为多少

( 你的行走速度为 \(1m/s\) )

解题思路

关完一个区间内的灯时 , 你必然在区间的左端点或者右端点

于是可以定义:

\(dp[l][r][0]\) 已关完区间 \([L , R]\) 内的灯 , 且最后一次关的灯在区间左端点

\(dp[l][r][1]\) 已关完区间 \([L , R]\) 内的灯 , 且最后一次关的灯在区间右端点

不难得到 :

\(dp[l][r][0]\) 可以由 \(dp[l + 1][r][0] , dp[l + 1][r][1]\) 转移得到

\(dp[l][r][1]\) 可以由 \(dp[l][r - 1][0] , dp[l][r - 1][1]\) 转移得到

转移的过程中 , 消耗的电量为 (总功率减去 - 已关点灯的功率) * 行走的距离

"已关点灯的功率"和"行走的距离"可以用前缀和维护

AC_Code

#include<bits/stdc++.h>
 
using namespace std;

const int M = 5e1 + 10;

struct node{
	int p , w , id;
	bool operator < (const node & b) const{
		return p < b.p;
	}
}a[M];

int sum1[M] , sum2[M] , dp[M][M][2];

int get1(int l , int r){
	return sum1[r] - sum1[l];
}

int get2(int l , int r){
	return sum2[r] - sum2[l - 1];
}

signed main()
{
	int n , c , tot = 0;
		
	cin >> n >> c;
	
	for(int i = 1 ; i <= n ; i ++) cin >> a[i].p >> a[i].w , a[i].id = i , tot += a[i].w;	

	sort(a + 1 , a + 1 + n);
	
	memset(dp , 0x3f , sizeof(dp));
	
	for(int i = 1 ; i <= n ; i ++) if(a[i].id == c) dp[i][i][0] = dp[i][i][1] = 0;
	
	for(int i = 1 ; i <= n ; i ++) sum1[i] = sum1[i - 1] + a[i].p - a[i - 1].p , sum2[i] = sum2[i - 1] + a[i].w;
	
	for(int len = 2 ; len <= n ; len ++)
	{
		for(int l = 1 ; l + len - 1 <= n ; l ++)
		{
			int r = l + len - 1;
			
			dp[l][r][0] = min(dp[l][r][0] , min(dp[l + 1][r][0] + get1(l , l + 1) * (tot - get2(l + 1 , r)) , 
							  					dp[l + 1][r][1] + get1(l , r) * (tot - get2(l + 1 , r))));
			dp[l][r][1] = min(dp[l][r][1] , min(dp[l][r - 1][0] + get1(l , r) * (tot - get2(l , r - 1)) , 
							  					dp[l][r - 1][1] + get1(r - 1 , r) * (tot - get2(l , r - 1))));
		}
	}
	
	cout << min(dp[1][n][0] , dp[1][n][1]) << '\n';
	
	return 0;
}
内容概要:本文介绍了基于Proteus利用SR锁存器74LS279和与非门74LS02D设计抢答器的方法。文章详细讲解了通过SR锁存器的高、低电平状态实现抢答锁定功能,即S低电平置高电平用于抢答,R低电平置低电平用于清零,确保抢答按键按下后无法再次触发。抢答结果通过数码管显示,其中1、2、3序号分别对应不同的按键,4路抢答器独立显示序号,3路抢答器则通过或逻辑处理并列抢答的情况,如1和2、1和3、2和3序号并列抢答时显示“3”,并用LED指示具体并列情况。电路还集成了声光反馈机制,当抢答有效时,蜂鸣器发出声音提示。此外,文章提到可通过三刀双掷开切换是否允许并列抢答,以及通过锁存器实现抢答器路数的扩展,并提出加入倒计时功能进一步完善系统。 适合人群:对数字电路设计有一定兴趣的电子爱好者,尤其是希望深入了解锁存器应用及抢答器设计原理的初学者和中级工程师。 使用场景及目标:①学习如何利用SR锁存器实现抢答器的基本功能;②掌握并列抢答情况下的电路处理方法;③理解数码管、LED、蜂鸣器等元件在电路中的应用;④探索电路的可扩展性和改进方向。 阅读建议:读者应结合Proteus软件进行实际电路仿真,动手搭建文中所述电路,逐步理解每个组件的作用及其相互系,同时注电路中可能出现的问题及解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值