【题解】牛牛大闯关
题意
给你个字符串,要求穿过这个字符串,初始能量为
,当走到
时,能量加一,反之能量减一,当能量小于
时,回到初始原点,并且初始能量加一。问当穿过字符串时总的步数是多少。
题解
答案实际上就是每次回到原点的位置的累加和,那么我们只要知道什么时候会回到原点即可在的复杂度完成计数,当当前能量小于
的时候我们不需要真的回到原点,因为每次回去的时候初始能量会加一,相当于我们可以从原点走到当前这个位置,且能量为0,开始闯关。当能量小于
时答案加上所在的位置
,然后能量变为0重新计数即可。
复杂度
时间复杂度
代码
#include <bits/stdc++.h> using namespace std; const int N = 1e6+5; char s[N]; int main() { int t; scanf("%d",&t); while (t--) { scanf("%s", s+1); int n = strlen(s+1); long long ans = 0, sum = 0; for (int i = 1; i <= n;i++) { if (s[i] == '1') sum++; else sum--; if (sum < 0) { ans += i; sum=0; } } ans += n; printf("%lld\n",ans); } return 0; }