o-p-p-o2023提前批0715-第二题 挑战boss

小欧正在一个回合制格斗游戏中挑战一个boss。已知游戏的0/3机制如下:

每回合小欧先手攻击boss,然后boss攻击小欧,此时1回合结束。小欧有时可以闪避boss的攻击,当闪避成功时这回合将不受boss的伤害。

小欧攻击boss时可以攒“连击点”,她攻击造成的伤害为a+kb,其中a为基础攻击力,b为基础连击伤害,k为连击次数。小欧每次攻击后会让连击次数加1,但当受到boss的伤害后会重置连击次数为0。

小欧想知道,她最终共对boss造成了多少伤害?

输入描述

第一行输入三个正整数$n,a,b$,代表回合的数量,小欧基础攻击力,小欧的基础连击伤害。

第二行输入一个长度为$n$的字符串,字符串仅由o和x组成,其中o代表本回合闪避成功,x代表本回合闪避失败。

$1<=n,a,b<=10^5$

输出描述

一个正整数,代表小欧造成的伤害总和。


示例:

1
2
3
4
5
6
输入:
3 5 2
oxo

输出:
17


分析:

难度:容易

1
直接根据输入进行模拟,在模拟的过程中通过一个变量来纪录连击次数,受到伤害时置为0,时间复杂度为O(n)

代码

  • C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>

using namespace std;

int main() {
int n, a, b;
cin >> n >> a >> b;
string s;
cin >> s;

int k = 0;
int ans = 0;
for (int i = 0; i < n; i ++) {
int t = a + k * b;
if (s[i] == 'o') ++ k;
else k = 0;
ans += t;
}

cout << ans << endl;

return 0;
}
  • java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

int n = in.nextInt();
int a = in.nextInt();
int b = in.nextInt();
in.nextLine();

char[] s = in.nextLine().toCharArray();

int k = 0;
int ans = 0;
for (int i = 0; i < n; i ++) {
int t = a + b * k;
if (s[i] == 'o') ++ k;
else k = 0;

ans += t;
}

System.out.println(ans);
}
}
  • Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n, a, b = map(int, input().split())
s = input()

def main():
ans, k = 0, 0;
for i in range(n):
t = a + b * k
if s[i] == 'o': k ++
else: k = 0

ans += t

print(ans)


main()
  • Golang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package main

import (
"fmt"
)

func main() {
var n, a, b int
fmt.Scan(&n, &a, &b)

var s string
fmt.Scan(&s)

k := 0
ans := 0
for i := 0; i < n; i++ {
t := a + k*b
if s[i] == 'o' {
k++
} else {
k = 0
}
ans += t
}

fmt.Println(ans)
}
0%