算法竞赛备考冲刺必刷题(C++) | 洛谷 B3639 T2点亮灯笼 - 详解
2025-11-27 18:06 tlnshuju 阅读(0) 评论(0) 收藏 举报本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
【题目描述】
有 n n n 个灯笼环形摆放。最开始,这些灯笼都是关闭的状态。
操作台上有 n n n 个按钮,按下第 x x x 个按钮时,会反转灯笼 x x x 以及相邻两个灯笼的状态。「反转」是指关闭变成点亮、点亮变成关闭。
举一个例子:如果按下第 5 5 5 个按钮,则 4 4 4、 5 5 5、 6 6 6 号灯笼都会反转;如果按下第 n n n 个按钮,则 n − 1 , n , 1 n-1, n, 1 n−1,n,1 这三个灯笼状态反转。这是因为灯笼放置为环形, n − 1 n-1 n−1 和 1 1 1 是与 n n n 相邻的灯笼。
我们依次按下了一些按钮。你需要编程求出当我们的操作完成后,最终这些灯笼的状态。
【输入】
第一行,两个正整数 n , m n, m n,m,分别表示共有 n n n 个灯笼、我们按了 m m m 次按钮。
接下来 m m m 行,每行一个正整数,表示我们在那一次操作中按下了哪个按钮。
【输出】
仅一行,
n
n
n 个整数,依次表示
n
n
n 个灯笼的状态,用空格隔开。以 0 代表灯笼关闭,以 1 代表灯笼点亮。
【输入样例】
5 4
1
3
1
2
【输出样例】
1 0 0 1 0
【算法标签】
《洛谷 B3639 T2点亮灯笼》 #数组#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 灯的数量
int m; // 操作次数
int a[1005]; // 灯的状态数组(0表示关,1表示开)
int x; // 每次操作控制的灯编号
int main()
{
// 输入灯的数量和操作次数
cin >> n >> m;
// 处理每个操作
for (int i = 1; i <= m; i++)
{
cin >> x; // 输入要操作的灯编号
// 根据灯的位置执行不同的切换操作
if (x == 1) // 操作第一个灯
{
a[1] = !a[1]; // 切换第1个灯
a[2] = !a[2]; // 切换第2个灯
a[n] = !a[n]; // 切换最后一个灯
}
else if (x == n) // 操作最后一个灯
{
a[1] = !a[1]; // 切换第1个灯
a[n-1] = !a[n-1];// 切换倒数第2个灯
a[n] = !a[n]; // 切换最后一个灯
}
else // 操作中间的灯
{
a[x-1] = !a[x-1]; // 切换前一个灯
a[x] = !a[x]; // 切换当前灯
a[x+1] = !a[x+1]; // 切换后一个灯
}
}
// 输出最终所有灯的状态
for (int i = 1; i <= n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
【运行结果】
5 4
1
3
1
2
1 0 0 1 0
浙公网安备 33010602011771号