代码改变世界

算法竞赛备考冲刺必刷题(C++) | 洛谷 B3639 T2点亮灯笼 - 详解

2025-11-27 18:06  tlnshuju  阅读(0)  评论(0)    收藏  举报

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:B3639 T2 点亮灯笼 - 洛谷

【题目描述】

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 n1,n,1 这三个灯笼状态反转。这是因为灯笼放置为环形, n − 1 n-1 n1 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