題目
解題思路:
- 首先注意到計算點數的公式
a * l + b
,可以發現如果把字串全部拿掉了話,那麼公式中a * l
的部份肯定是一樣的
- 再來是b的部份,取決於總共拿了幾次
- 如果b<0那麼拿愈少次愈好,如果b>0那麼拿愈多次愈好(就直接拿
l
次)
- 要如何拿的少次:需要一些觀察,在紙上稍微畫一下就會知道了,這是我寫這題學到的最重要的事情
程式碼:
// https://codeforces.com/contest/1550/problem/B
#include <iostream>
using namespace std;
int part(const string str)
{
long long part = 1, len = str.length();
char lastChar = str[0];
for (int i = 1; i < len; i++) {
if (lastChar != str[i])
part++;
lastChar = str[i];
}
return part;
}
int main()
{
int t;
cin >> t;
while (t--) {
long long n, a, b, sum = 0;
string str;
cin >> n >> a >> b;
cin >> str;
if (b >= 0) {
cout << ((a + b) * str.length()) << endl;
} else {
cout << (long long)(a * str.length() + b * (part(str) / 2 + 1)) << endl;
}
}
return 0;
}