题目描述
码队的女朋友非常喜欢玩某款手游,她想让码队带他上分。但是码队可能不会带青铜段位的女朋友上分,因为码队的段位太高(已经到达王者),恐怕不能和他的女朋友匹配游戏。
码队的女朋友有些失落,她希望能尽快冲上王者。这个赛季开始了,求胜心切的码队的女朋友想让码队帮她计算一个问题:
这个赛季码队的女朋友一共打了 N 场排位赛,每一场排位赛中,码队女朋友的成绩用 Si 来表示(成绩只可能为“赢”或“输”。 1 代表码队女朋友赢了这场比赛,0 则代表输了这场比赛)。由于这款游戏使用净胜场数这个数据指标来衡量玩家能否晋级更高的段位(玩家净胜场数 = 玩家赢场数 - 玩家输场数),所以码队的女朋友想知道,这个赛季的过程中她的最高净胜场次。
码队听完他女朋友的问题之后,觉得她有些天真,因为码队知道,这家游戏厂商可能出于不想让玩家早“弃坑”的目的,所以在每个赛季都会给每位玩家发出 K 张 「排位保护卡」。如果一名玩家在一场排位赛中输掉了游戏,但 TA 还有排位保护卡,那么系统将自动为 TA 用掉一张排位保护卡,帮该玩家抵消这场输掉的排位赛(即在系统记录成绩时,不将该局游戏计入玩家的输场数)。但是,如果一名玩家在某个赛季中,没有用完这 K 张排位保护卡,那么这些剩余的排位保护卡将失效,不能在下个赛季继续使用。
听完码队说的这些事情以后,码队的女朋友变得更有信心了!现在,码队的女朋友想求助你:如果按照这个赛季的这 N 场排位赛成绩来计算,经过 M 个赛季(假设每个赛季都打 N 场排位赛,且每个赛季都获得了完全相同的排位赛成绩),那在这 M 个赛季过程中,她的最高净胜是多少场?
输入格式
第一行一个整数 T,表示有几组数据(T≤1000)。
对于每一组测试数据:第一行有三个整数 N,K,M,分别代表码队的女朋友在一个赛季里总共打了 N 场排位赛,每个赛季有 K 张排位保护卡,总共将进行 M 个赛季,以空格分隔。(1≤K≤N≤100,1≤M≤109)
接下来一行,输入一个长度为 N 的字符串(只由 0 和 1 组成),代表码队的女朋友在一个赛季里的每场排位赛中的成绩 Si (i=1,2,⋯,N)。
输出格式
对于每一组测试数据,输出一行。
每行只包含一个整数,代表在 M 个赛季过程中,码队的女朋友最高能净胜多少场游戏。如果净胜场数为负,请输出 0。
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
1
5 1 2
11110
样例输出1
8
样例输入2
1
5 2 2
00101
样例输出2
2
一个普通的模拟,跑第一遍,遇到失败优先使用保护卡。
记录过程中出现的最大值和跑完一遍后的结果
如果结果大于0,那么每过一个赛季,最后的净胜场数都会增加,峰值为最后一个赛季的最大值。
如果结果小于0,那么每过一个赛季,最后的净胜场数都会减少,峰值为第一个赛季的最大值。
建立二维坐标系,横坐标为比赛场数,纵坐标为净胜场数。画个曲线便很容易理解。
Code
/**
* author: Akvicor
* created: 2019-07-20 14-06-17
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef DEBUG
string to_string(string s) {
return '"' + s + '"';
}
string to_string(const char* s) {
return to_string((string) s);
}
string to_string(bool b) {
return (b ? "true" : "false");
}
template <typename A, typename B>
string to_string(pair<A, B> p) {
return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
template <typename A>
string to_string(A v) {
bool first = true;
string res = "{";
for (const auto &x : v) {
if (!first) {
res += ", ";
}
first = false;
res += to_string(x);
}
res += "}";
return res;
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T) {
cerr << " " << to_string(H);
debug_out(T...);
}
#endif
#ifdef DEBUG
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 17
#endif
#ifdef DEBUG
#define FAST_IO 17
#else
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#endif
#define LL long long
#define ULL unsigned long long
#define rep(i, n) for(int i = 0; i < (n); ++i)
#define reep(i, n) for(int i = 0; i <= (n); ++i)
#define lop(i, a, n) for(int i = a; i < (n); ++i)
#define loop(i, a, n) for(int i = a; i <= (n); ++i)
#define ALL(v) (v).begin(), (v).end()
#define PB push_back
#define VI vector<int>
#define PII pair<int,int>
#define FI first
#define SE second
#define SZ(x) ((int)(x).size())
const double EPS = 1e-6;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const LL LINF = 0x7f7f7f7f7f7f7f7f;
const int MAXN = (int)1e6 + 10;
const int MOD = (int)1e9 + 7;
int t, n, k, m;
int main(){
FAST_IO;
LL ans = 0;
cin >> t;
while(t--){
cin >> n >> k >> m;
string s;
ans = 0;
cin >> s;
LL cnt = 0;
for(auto &i : s){
if(i=='1') ++ans;
else if(i=='0'){
if(k){
--k;
}else{
--ans;
}
}
cnt = max(ans, cnt);
}
if(ans > 0){
cout << ans*(m-1) + cnt << endl;
}else{
cout << cnt << endl;
}
}
return 0;
}