题目解释
有一排彩灯,每盏灯上有一个数字。我们需要熄灭一些灯,使得剩下的灯从左到右显示的数字正好是连续的: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;
}
代码说明
- 输入处理:先读入彩灯数量
n,再读入每盏灯的数字。 - 不使用数组:
- 因为数据量比较大,所以优先考虑不使用数据,增加运算速度
- 结果判断:
- 如果
count为0(一个数字都没找到),输出-1。 - 否则,输出
n - count(总灯数减去保留的灯数)。