Educational Codeforces Round 90 (Rated for Div. 2) 参与排名人数12840
[codeforces 1373C] Pluses and Minuses 找规律,难在+号会使数据发生跳跃,跳过了中间的+号
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1373/problem/C
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
C - Pluses and Minuses | GNU C++17 | Accepted | 46 ms | 4600 KB |
题目大意:给定一个包含'-','+'符号的字符串,自小到大,给出每次的前进动力(对应题目代码中的变量init),'-'会使前进的动力-1,'+'会使前进的动力+1,若前进动力小于0,此次前进中止,从头开始字符串的遍历,中止时的步数参与求和,求,能完成该字符串的遍历(走完字符串,并且,前进动力大于等于0),输出所有步数和。
样例模拟如下:
--+-
7
1.最开始动力是0
起始动力0
字符位置1 2 3 4
字符数值- - + -
结束动力-1
此次步数是1
2.最开始动力是1
起始动力1 0
字符位置1 2 3 4
字符数值- - + -
结束动力0 -1
此次步数是2
3.最开始动力是2
起始动力2 1 0 1
字符位置1 2 3 4
字符数值- - + -
结束动力1 0 1 0
此次步数是4
总的步数是1+2+4=7
---
9
1.最开始动力是0
起始动力0
字符位置1 2 3
字符数值- - -
结束动力-1
此次步数是1
2.最开始动力是1
起始动力1 0
字符位置1 2 3
字符数值- - -
结束动力0 -1
此次步数是2
3.最开始动力是2
起始动力2 1 0
字符位置1 2 3
字符数值- - -
结束动力1 0 -1
此次步数是3
4.最开始动力是3
起始动力3 2 1
字符位置1 2 3
字符数值- - -
结束动力2 1 0
此次步数是3
总的步数是1+2+3+3=9
++--+-
6
1.最开始动力是0
起始动力0 1 2 1 0 1
字符位置1 2 3 4 5 6
字符数值+ + - - + -
结束动力1 2 1 0 1 0
此次步数是6
总的步数是6
再举一例
1
++-+-
1.最开始动力是0
起始动力0 1 2 1 2
字符位置1 2 3 4 5
字符数值+ + - + -
结束动力1 2 1 2 1
此次步数是5
总的步数是5
AC代码如下:
#include <stdio.h>
#include <string.h>
#define maxn 1000010
#define LL long long
char s[maxn];
LL ans;
int main(){
int t,cur,i,n;
scanf("%d",&t);
while(t--){
scanf("%s",s+1);
n=strlen(s+1),cur=0,ans=0;
for(i=1;i<=n;i++){
if(s[i]=='+')cur++;
else cur--;
if(cur<0)ans+=i,cur=0;//i表示当前步数.i==n时,要求cur>=0,此判断语句不执行,之后ans+=n打了补丁。
}
ans+=n;//需要到达终点时,cur>=0
printf("%lld\n",ans);
}
return 0;
}