Island Tour

AtCoder Beginner Contest 338
D - Island Tour
题目链接


题意:

(小日子的英语真的看不懂,也听不懂QAQ)

N N N 座岛和 N N N 座桥,第 i i i 座桥连接第 i i i 个岛和第 i + 1 i+1 i+1 个岛(第 N N N 座桥连接第 1 1 1 个岛和第 N N N 个岛)。一位旅行者想要从岛 X 1 X_1 X1 出发,按顺序游览岛 X 2 , X 3 , . . . , X M X_2,X_3,...,X_M X2,X3,...,XM

现在删掉一座桥,问现在游览这些岛需要经过多少座桥?

思路:

假设从岛 l l l 走到岛 r r r,因为从 l l l 走到 r r r 和从 r r r 走到 l l l 经过的桥数是一样,不妨假设 l < r l<r l<r。如果没删桥,那么有两种方式从岛 l l l 走到岛 r r r,即 l → r l\rightarrow r lr l → 1 → n → r l\rightarrow 1 \rightarrow n \rightarrow r l1nr ,两种方式经过的路线长度分别为 r − l r-l rl n + l − r n+l-r n+lr。没删桥的时候肯定两者取其小,但是删掉桥的话,删掉的桥一定在两者其一的路径上,如果在长的路径上就没有影响,但是如果在短的路径上就会导致绕远路。

话句话说,删掉短路径上的桥,会导致吃到一个绕远路的代价,那么我们可以给所有短路径上的桥都记录一下代价是多少,把 M − 1 M-1 M1 条游览路线都算一遍累加起来,那么删掉一个桥只看代价之和就知道删掉它之后的总的路线长度为多少。最后只需要枚举一下所有桥取最小代价即可。

当然不可能枚举短路径上的所有桥去加代价,太慢了,所以我们使用差分数组。如果原本要走 l → r l\rightarrow r lr ,那么给路径上的桥加代价 t = n + l − r − ( r − l ) t=n+l-r-(r-l) t=n+lr(rl),那么 c o s t [ s ] + = t , c o s t [ t + 1 ] − = t cost[s]+=t,cost[t+1]-=t cost[s]+=t,cost[t+1]=t。如果原本要走 l → 1 → n → r l\rightarrow 1 \rightarrow n \rightarrow r l1nr ,那么给路径上的桥加代价 t = r − l − ( n + l − r ) t=r-l-(n+l-r) t=rl(n+lr),那么 1 ∼ l 1\sim l 1l r ∼ n r\sim n rn 都要加代价,在差分数组上就是 c o s t [ 1 ] + = t , c o s t [ l + 1 ] − = t , c o s t [ r ] + = t , c o s t [ n + 1 ] − = t cost[1]+=t,cost[l+1]-=t,cost[r]+=t,cost[n+1]-=t cost[1]+=t,cost[l+1]=t,cost[r]+=t,cost[n+1]=t

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;

int n,m;
int des[maxn];
ll cst[maxn];//删除i->i+1边的代价 
ll ans=1e18,lst=0;

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>des[i];
	for(int i=2,l,r,t;i<=m;i++){
		l=min(des[i],des[i-1]);
		r=max(des[i],des[i-1]);
		
		if(r-l<=n+l-r){//原本走l->r 
			t=n+l-r-(r-l);
			lst+=r-l;
			cst[l]+=t;
			cst[r]-=t;
		}
		else {
			t=r-l-(n+l-r);
			lst+=n+l-r;
			cst[r]+=t;
			cst[1]+=t;
			cst[l]-=t;
		}
	}
	
	for(int i=1;i<=n;i++){
		cst[i]+=cst[i-1];
		ans=min(ans,cst[i]);
	}
	cout<<lst+ans;
	return 0;
}
  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Functional Safety Island(功能安全小岛)是一个术语,用于描述在一些特定领域中,需要将功能安全保证独立于其他工作流程、系统或模块的一片区域。功能安全指的是在系统或产品中保证安全性能,并防止可能的危险或事故。 在汽车行业中,Functional Safety Island常常指的是车辆的电子控制单元(ECU),如发动机控制模块或刹车控制模块等。这些ECU在车辆上被独立地部署,并且有严格的安全标准和要求。它们负责控制汽车的关键功能,如制动、加速和转弯等,以确保车辆在行驶过程中的安全。 Functional Safety Island在其他领域也有应用。例如,在工业自动化中,控制系统通常将功能安全独立地集成到关键过程中。这样可以确保即使在系统的其他部分出现故障或错误时,安全功能仍然能够正常运行,并防止潜在的事故发生。 Functional Safety Island的概念强调了功能安全的重要性,并提醒我们需要将安全性作为一项独立的设计和控制因素考虑。通过将功能安全独立于其他工作流程、系统或模块,可以提高系统的可靠性和安全性,减少潜在风险,并保护人们的生命和财产安全。 ### 回答2: Functional Safety Island 是指一个系统中的一个功能安全领域。在汽车、航空、医疗、工业等关键领域中,使用的系统通常需要具备高可靠性和安全性。为了实现这一目标,系统通常被划分为多个功能安全领域,每个领域被称为一个“岛屿”。 Functional Safety Island 的目的是通过将系统分割成多个独立的区域,限制错误或故障的扩散,以确保系统在发生故障时仍能保持可用和安全。每个岛屿中会包含特定的功能单元,并通过安全机制和措施来监测和管理其运行状态。 每个 Functional Safety Island 都有一定的独立性和自主性,可以在一个岛屿内独立地进行故障处理和控制。这种独立性使得系统能够更好地应对单个岛屿内部发生的错误或故障,并且在某个岛屿发生故障时,其他岛屿仍然可以正常工作,从而保证整个系统的功能连续性和安全性。 Functional Safety Island 的设计和实施需要考虑到系统的功能要求、风险评估和安全标准等因素。对于每个岛屿,会进行系统设计、故障树分析、可靠性评估等工作,以确保系统的功能安全性能符合要求。 总之,Functional Safety Island 是系统安全保障的一种重要手段,通过将系统划分为多个独立的区域,限制错误或故障的扩散,提高系统的可用性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值