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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现