本文主要是介绍J - Juggling Troupe Gym - 101623J(结论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
一些数(0,1,2)。
每轮游戏中2会分到左右两个位置(第一个和最后一个只会分到一个位置)。
全是0,1时游戏结束,求最终序列。
思路:
感觉像个经典结论题(波形碰撞?),但是找不到源头,感觉证明不了。。。
将每个2单独考虑,找到其左边第一个a[l]=0,右边第一个a[r]=0,可以发现在l+r-x的位置会出现0,a[l],a[r]变成1。然后依次考虑下去。
#include<cstdio>
#include<set>
#include<cstring>
#include<algorithm>using namespace std;
const int maxn = 1e6 + 7;char s[maxn];
set<int>st;int main() {scanf("%s",s + 1);int n = strlen(s + 1);st.insert(0);st.insert(n + 1);for(int i = 1;i <= n;i++) if(s[i] == '0') st.insert(i);for(int i = 1;i <= n;i++) {if(s[i] == '2') {auto r = st.lower_bound(i),l = r;--l;int x = *l + *r - i;if(*l > 0) st.erase(l);if(*r <= n) st.erase(r);st.insert(x);}}for(int i = 1;i <= n;i++) s[i] = '1';for(auto it = st.begin();it != st.end();it++) {s[*it] = '0';}for(int i = 1;i <= n;i++) printf("%c",s[i]);return 0;
}
这篇关于J - Juggling Troupe Gym - 101623J(结论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!