彩灯

题目解释

有一排彩灯,每盏灯上有一个数字。我们需要熄灭一些灯,使得剩下的灯从左到右显示的数字正好是连续的:1, 2, 3, …(从1开始,每个数字比前一个大1)。问最少需要熄灭多少盏灯?如果无法实现,输出-1。

解题思路

我们可以想象自己在按顺序找数字:先找1,找到1后接着找2,然后找3,以此类推。在遍历所有灯的过程中:

  • 如果遇到当前要找的数字(比如先找1,然后2,然后3…),就保留这盏灯,并开始找下一个数字。
  • 如果遇到不是当前要找的数字,就熄灭这盏灯(跳过它)。

最后,我们统计找到了多少个连续的数字(比如找到了1,2,3,那么就是3个)。用总灯数减去找到的连续数字的个数,就是最少需要熄灭的灯数。如果连1都没找到,说明无法实现,输出-1。

示例说明

示例1:彩灯数字为 [2, 1, 3, 4]

    • 先找1:跳过2,找到1(保留),接着找2。
    • 找2:跳过3,跳过4(没找到2),只保留了1。
    • 保留1盏灯,熄灭3盏灯,输出3。

    示例2:彩灯数字为 [1, 3, 2, 4]

      • 先找1:找到1(保留),接着找2。
      • 找2:跳过3,找到2(保留),接着找3。
      • 找3:跳过4(没找到3),保留了1和2。
      • 保留2盏灯,熄灭2盏灯,输出2。

      示例3:彩灯数字为 [1, 2, 3, 4]

        • 依次找到1、2、3、4,全部保留,熄灭0盏灯,输出0。

        示例4:彩灯数字为 [2, 3, 4]

          • 连1都没找到,无法实现,输出-1。

          代码实现

          #include <bits/stdc++.h>
          using namespace std;
          int main(){
              //数据量比较大,不建议用数组 
              int n,cnt,num,tmp; 
              cin>>n;
              num=1;//从编号1开始找 
              cnt=0;
              for(i=1;i<=n;i++){
                  cin>>tmp;
                  if(num==tmp){
                      cnt++;//找到就统计加1 
                      num++;//继续找下一个编号 
                  } 
              } 
              //输出统计结果 
              if(cnt==0){//如果没有 
                  cout<<"-1";
              }else{
                  cout<<n-cnt;
              }
              return 0;
          } 

          代码说明

          1. 输入处理:先读入彩灯数量 n,再读入每盏灯的数字。
          2. 不使用数组
          • 因为数据量比较大,所以优先考虑不使用数据,增加运算速度
          1. 结果判断
          • 如果 count 为0(一个数字都没找到),输出-1。
          • 否则,输出 n - count(总灯数减去保留的灯数)。