求条
  • 板块灌水区
  • 楼主littlesnake
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/6/8 19:38
  • 上次更新2024/6/8 21:41:12
查看原帖
求条
574745
littlesnake楼主2024/6/8 19:38

描述

要开篝火晚会了!现在有 NN 个人排成一圈, 对于第 ii 个人来说,他右面的人的编号为 i+1i+1,第 nn 个人右面的编号为 11。

每个人有一个容量为 aia_i 的酒杯。一开始所有人的酒杯都装满了啤酒。

但是大家的酒品不是很好,都喜欢逃酒!

每一分钟,所有人都会根据一个字符串 s_1 s_2 \dots s_N 将啤酒“不小心”洒一点到左右两边的人杯中,该字符串仅由字符 将啤酒 “不小心” 洒一点到左右两边的人杯中,该字符串仅由字符 L和和R$ 组成。

当第 ii 个人至少有 11 升啤酒时,如果 si=Lsi=L,他会将 11 升啤酒洒给她左边的人的酒杯中,如果 si=Rsi=R,她会将 11 升啤酒洒到右面的人的酒杯里。

所有交换同时发生(即,如果一个人的酒杯是满的,送出 11 升啤酒的同时,也收到 11 升啤酒——好恶心,则她杯中酒的总量保持不变)。

如果此时一个人的啤酒超过了杯子的容量 aia_i ,则多余的啤酒会洒在地上。

问:经过 MM 分钟后,所有人的酒杯中总共还余下多少啤酒?

输入描述

输入的第一行包含 NN 和 MM。

第二行包含一个字符串 s ,仅由字符 L 或 R 组成,表示每个人洒啤酒的方向。

第三行包含整数 a_1,a_2, \dots a_N$ ,为每个酒杯的容量。

数据范围

1≤N≤2×105,1≤M≤109,1≤ai≤1091≤N≤2×10^5,1≤M≤10^9,1≤a_i≤10^9

输出描述

输出一个整数表示答案

用例输入 1

3 1
RRL
1 1 1

用例输出 1

2

用例输入 2

5 20
LLLLL
3 3 2 3 3

用例输出 2

14

用例输入 3

9 5
RRRLRRLLR
5 8 4 9 3 4 9 5 4

用例输出 3

38

提示

样例1解释 22 号和 33 号 互相洒了一升啤酒,因此他们的啤酒总量保持不变。

当 11 号 将啤酒洒给 22 号 时, 22 号 的桶会溢出,从而一分钟后损失了一升啤酒(浪费了)。


# include <bits/stdc++.h>

using namespace std;

int n, m;
string s;
int a[200010], b[200010];

int main () {
	
	cin >> n >> m;
	cin >> s;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		b[i] = a[i];
	}
	for (int k = 1; k <= m; k ++) {
		for (int i = 1; i <= n; i ++) {
			if (a[i] >= 1) {
				if (s[i] == 'L') {
					if (i == 1) a[n] += 1, a[1] -= 1;
					else a[i - 1] += 1, a[i] -= 1;
				} else {
					if (i == n) a[1] += 1, a[n] -= 1;
					else a[i + 1] += 1, a[i] -= 1;
				}
			}	
		}
		for (int i = 1; i <= n; i ++) {
			if (a[i] > b[i]) b[i] = a[i];
		}
	}
	int sum = 0;
	for (int i = 1; i <= n; i ++) sum += a[i];
	cout << sum;
	
	return 0;
}
2024/6/8 19:38
加载中...