题目描述
小 X 刚把猜先的程序交给少年宫的小朋友就接到了健身教练的电话,教练要求他马上到中天体育馆练习投篮,之所以选择投篮这个项目,主要目的是要在帮助小 X 减肥的同时还能预防颈椎病,小 X 每次必须投满规定的积分才能结束投篮,积分规则是这样的:小 X 每投中一个球得 1 分,如果没投中但球碰到了篮框、篮板或篮网则既不得分也不扣分,如果球啥也没碰到(俗称三不沾)则倒扣 1 分,作为奖励小 X 如能连续投中 3 球则额外加 1 分,如连续投中 4 球则额外加 2 分,依次类推,即连续投中 K 球(K>=3)则额外加 K-2 分,教练每次给小X 计分都很辛苦,于是他要求小 X 设计一个能自动计分的程序,小 X 觉得这个程序也很简单,于是他把这个任务又交给了你!
输入
输入数据共有两行,第一行为一个正整数 n,表示小 X 共进行了 n 次投篮,第二行为一个由 n 个字符组成的字符串,该字符串只包含三种字符,分别是大写字母’V’,’T’,’X’,其中’V’表示投中了, ’T’表示没投中但不用扣分, ’X’表示要扣 1 分。
输出
输出一行仅有一个整数为小 X 的得分。
样例输入
8 VVVVVTXV
样例输出
8
提示
【样例解释】
小 X 先连续投中 5 个球,得到 5+3 分,其中 3 分为额外奖励到的。接着第六个球没投中也没扣分,第七个球扣了 1 分, 最后一球得 1 分, 因此答案为 8。
【数据范围】
对于 20%的数据 n<=10
另外 20%的数据不存在连续的 3 个’V’
另外 30%的数据不存在’X’
100%的数据 n<=10000
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long n,k,cc=1,s;
string str;
int main(){
cin>>n>>str;
for(int i=0;i<n;i++){
if(str[i]=='V'){
s++;
if(cc==1||str[i-1]=='T'||str[i-1]=='X'){
while(str[i+k]=='V'){
k++;
}
if(k>2) s=s+k-2;
k=0;
cc++;
}
}
if(str[i]=='X') s--;
}
cout<<s;
return 0;
}
*注:第10行为了避免k重复加,如样例:VVVVVTXV
如果没有第10行就会判断VVVVVTXV是连续进球
VVVVVTXV是连续进球
VVVVVTXV是连续进球
其中cc==1是判断是不是第一次判断,如果是第一次判断则运行(VVVVVTXV是连续进球,而VVVVVTXV和VVVVVTXV就不是是连续进球)
str[i-1]=='T'||str[i-1]=='X'是判断如果V在T或X的后面,是重新开始进球,也可以运行