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;
}

浙公网安备 33010602011771号