T2 点亮灯笼

文章描述了一个关于环形排列的灯笼状态翻转的编程问题。给定灯笼数量n和操作次数m,每次操作按下一个按钮会翻转自身及其相邻灯笼的状态。程序需要计算所有操作后灯笼的状态,以0和1表示关闭和点亮。输入包括操作次数和每次操作的按钮编号,输出为所有灯笼的状态。示例给出了具体的操作过程和结果。数据规模限定为n,m<=1000。
摘要由CSDN通过智能技术生成

题目背景

请尽量在 20min 之内写完题目。这是指「写代码」的时间;「读题」时间不计算在内。

题目描述

有 nn 个灯笼环形摆放。最开始,这些灯笼都是关闭的状态。

操作台上有 nn 个按钮,按下第 xx 个按钮时,会反转灯笼 xx 以及相邻两个灯笼的状态。「反转」是指关闭变成点亮、点亮变成关闭。

举一个例子:如果按下第 55 个按钮,则 44、55、66 号灯笼都会反转;如果按下第 nn 个按钮,则 n-1, n, 1n−1,n,1 这三个灯笼状态反转。这是因为灯笼放置为环形,n-1n−1 和 11 是与 nn 相邻的灯笼。

我们依次按下了一些按钮。你需要编程求出当我们的操作完成后,最终这些灯笼的状态。

输入格式

第一行,两个正整数 n, mn,m,分别表示共有 nn 个灯笼、我们按了 mm 次按钮。

接下来 mm 行,每行一个正整数,表示我们在那一次操作中按下了哪个按钮。

输出格式

仅一行,nn 个整数,依次表示 nn 个灯笼的状态,用空格隔开。以 0 代表灯笼关闭,以 1 代表灯笼点亮。

输入输出样例

输入 #1复制

5 4
1
3
1
2

输出 #1复制

1 0 0 1 0

说明/提示

样例解释

灯笼序列的状态如下:

0 0 0 0 0  # 初始状态
1 1 0 0 1  # 按下 1 之后的状态
1 0 1 1 1  # 按下 3 之后的状态
0 1 1 1 0  # 按下 1 之后的状态
1 0 0 1 0  # 按下 2 之后的状态

因此你应当输出 1 0 0 1 0

数据规模与约定

对于 100\%100% 的数据,有 n\leq 1000n≤1000,m\leq 1000m≤1000。

我们可以使用一个数组 aa 来记录当前所有灯的状态,用 00 表示关闭,用 11 表示打开。数组初值均为 00。

接下来,对于每一次操作 xx,将 a_{x-1},a_{x},a_{x+1}ax−1​,ax​,ax+1​ 全部取反即可。可以通过 1-t \rightarrow t1−t→t(将 1-1− 那个数赋值给那个数)的方式取反。

但是由于是环形摆放,需要特判 x=1,x=nx=1,x=n。


while(m--) {
	int x; scanf("%d", &x);
	if(x == 1) a[1] = 1 - a[1], a[2] = 1 - a[2], a[n] = 1 - a[n];
	else if(x == n) a[n] = 1 - a[n], a[n - 1] = 1 - a[n - 1], a[1] = 1 - a[1];
	else a[x] = 1 - a[x], a[x + 1] = 1 - a[x + 1], a[x - 1] = 1 - a[x - 1];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值