5539.牛奶交换

题目链接:https://www.acwing.com/problem/content/description/5542/

题意:

给定一排满的牛奶桶,根据字符串s每桶牛奶会往左边的桶倒或右倒1升(同时),求m分钟后这些桶里还剩多少牛奶

思路:

不难发现 当两个相邻的牛奶桶倾倒方向为 RL 时,恰好形成平衡。所以如果当这两个牛奶桶形成的整体左边有往右倒、右边有往左倒的,每分钟一定会浪费掉1

根据样例3发现最后一侧浪费掉的为 能够用来浪费的牛奶总量与时间 的min

由于是环,我们直接在数组左右分别重新再开一段数组,注意此时下标一定是要从0~n-1读入的,否则会发生错误

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll n,m;
string str;
ll a[N];
ll sum=0,ans=0;//sum记录原始牛奶和,ans记录期间溢出的牛奶,最终结果是两者的差
int main()
{
cin>>n>>m>>str;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
for(int i=0;i<n;i++)
{
int af=(i+1)%n; //af是后一位的下标,用于判断两个传递方向是否是相向的
if(str[i]=='R'&&str[af]=='L')
{
ll last=(i-1+n)%n;
ll temp=0;
while(str[last]=='R')//记录相遇处左边往右边传递的所有牛奶的和
{
temp+=a[last];
last=(last-1+n)%n;
}
ans+=min(temp,m);
temp=0;
ll aff=(af+1)%n;
while(str[aff]=='L')//同理,记录相遇处右边往左边传递的所有牛奶的和
{
temp+=a[aff];
aff=(aff+1)%n;
}
ans+=min(temp,m); //实际溢出值要去更小值
}
}
cout<<sum-ans<<endl;
}
posted @   Marinaco  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示