Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!) C. Ice and Fire

 题意:给你n个人,第i个人的力量值为i,一共会进行n-1次比赛,第i次比赛会从[1,i+1](i<=n-1)里随机选两个人,然后根据si取获胜(如果si是1,那么取两个人的力量值大的获胜,如果是0,取小的获胜)的人,问你有多少个人可能可以获胜到最后。

思路:我们从最后一段连续的1或者0来看,若最后一段连续的相同字符的个数为x,那么必然有x个人不能获胜,n-x个人可以获胜。比如给一个字符串1100111,在8个人中选人,最后三个1,也就是第5、6、7场,所筛选的是经过1100这四场后所剩下的最大值,还剩四个人。而3肯定不会成为四个人中的最大值,因为3前面就找不到3个数比它小了,所以它不会赢,必然要被淘汰。1和2也是同理。所以编号{1,2,3}是肯定要被淘汰的,而{4,5,6,7,8}为什么都可能会赢呢?我们可以这样设计:假设我们想让{4}成为可能的答案,我们可以安排除了{1,2,3,4}以外的数,也就是{5,6,7,8}经过前三场110的淘汰,最后剩下一个数我们设它为k,在第四场时候让k和1比赛,因为此时的si是0,所以肯定是1获胜,最后只剩下连续的三个1了,我们在{1,2,3,4}中取到最大值,也就是4获胜了。同理,5,6,7也可以这样设计使它成为答案。

void solve() {
	int n, zero = 0, one = 0;
	string s;
	cin >> n >> s;
	FOR(0, n - 2) {
		if (s[i] == '1')  one++;
		else zero++;
		if (i == 0 || s[i] != s[i - 1]) zero = one = 0;
		cout << i - max(zero, one) + 1 << " \n"[i == n - 2];
	}
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值