Juggling Troupe 打表找规律

Juggling Troupe 打表找规律

题解:

这个居然是一个打表找规律的题目,不可思议,这个规律好难找。。。

规律: 如果第 i 个位置是2,找到左边离它最近的0 设为L,找到右边离它最近的0 设为 R,

那么对于区间 [L,R] ,位置 L+R-i 的数字变成0,其他都是1

又发现每个2是独立的,即每个2可以不同时扔球,可以分开处理。所以最终的解法就是按照只有一个2的解法解决每个2即可。(这里有点不理解。。。)

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int pre[maxn],last[maxn],cnt1,cnt2,ans[maxn];
char s[maxn];

int main(){
	scanf("%s",s+1);
	int n = strlen(s+1);
	last[0] = n+1;
	cnt1 = cnt2 = 0;
	for(int i=n;i>=1;i--){
		ans[i] = 1;
		if(s[i]=='0') last[++cnt2] = i;
	}
	for(int i=1;i<=n;i++){
		if(s[i]=='2'){
			int j = pre[cnt1]+last[cnt2]-i;
			if(cnt1) --cnt1;
			if(cnt2) --cnt2;
			if(j>i) last[++cnt2] = j;
			else pre[++cnt1] = j;
		}
		else if(i==last[cnt2]) pre[++cnt1] = last[cnt2--];
	}
	for(int i=1;i<=cnt1;i++) ans[pre[i]] = 0;
	for(int i=1;i<=n;i++) printf("%d", ans[i]);
	printf("
");
}
原文地址:https://www.cnblogs.com/EchoZQN/p/13770254.html