AtCoder - ABC 267 - B(暴力模拟)

这篇博客讨论了一道编程题,题目涉及保龄球瓶的排列和倒立状态。给定10个球瓶的初始状态,需要判断是否满足特定条件:1号球瓶倒下,并且存在两列之间有全倒的一列。博主分享了使用暴力模拟的解决方案,通过更新每列球瓶状态并双重循环检查条件来得出答案。

B - Split? 

题目:

有 7 列保龄球瓶,总共有 10 个球瓶,每一列有哪些球瓶给你了,现在有几个瓶倒了,问是否有满足以下两个条件:
1.编号为 1 的瓶倒了
2.有两列至少有一个瓶站着,且这两列中间有一列全倒了。 

输入长度为 10 的字符串表示 10 个球瓶的状态,'0' 表示倒了;'1' 表示没倒。如果满足条件输出Yes,否则输出 No。初始保龄球瓶状态如下:

 

数据范围:

长度为10的字符串,仅由字符0,1组成。

思路:

暴力模拟,需要记录每一列现存的球瓶的个数;每个圆所属的列。然后:
首先判断是否球瓶1被选了,没被选直接No,如果被选了之后再:

1.根据输入的 10 个球瓶的初始状态,根据输入的球瓶状态更新每一列球瓶的个数;
2.用两重循环枚举两列,如果存在两列的各自现存的球瓶的个数都不为 0,则再在这两列之间枚举列,如果存在某列拥有球瓶的个数为 0,Yes。否则,No。

Code:

#include<iostream>
#include<algorithm>
using namespace std;

const int N = 200010;

int row[11] = { 0,4,3,5,2,4,6,1,3,5,7 };   //数组row[i]表示第i个圆所在的列
int cnt[8] = { 0,1,1,2,2,2,1,1 };          //数组cnt[i]表示第i列圆的个数

void solve()
{
	char s[11];
	cin >> (s + 1);                              //输入10个圆的状态
  
	if (s[1] == '1')return void(puts("No"));     //第一个条件都不满足
	else
	{
		for (int i = 1; i <= 10; i++)            //更新每一列现存的圆个数
		{
			if (s[i] == '0')
				cnt[row[i]]--;                   //表示第i个圆所在的第row[i]列的圆的个数cnt[row[i]]减1
		}
	}

	for(int i = 1;i<=7;i++)					      //枚举两列中的前一列
		for(int j = i+1;j<=7;j++)                 //枚举两列中的后一列
			if (cnt[i] && cnt[j])                 //如果出现两列各自现存的圆的个数都不为0
			{
				for (int k = i + 1; k < j; k++)   //遍历这两列中间的列
					if (cnt[k] == 0)              //如果出现列中圆的个数为0,满足条件
						return void(puts("Yes"));
			}

	puts("No");
}

int main()
{
	int t = 1;
	//cin >> t;
	while (t--)
	{
		solve();
	}

	return 0;
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
吐槽:当时写这题时就是纯暴力,用运算符 | 预处理的,写得可麻烦还可容易写错。看了大大的模拟就很清晰,预处理分得也很细。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值