度小满笔试第一题
题目描述:
小A在宾馆打工。一日,小A需要把宾馆一个走廊上n个灯全部关掉。走廊上的灯编号为1—n。宾馆的电路有设计缺陷。宾馆的走廊上有n个开关,第i个开关只可以改变i~n号电灯的状态,即亮的熄灭,熄灭的变亮。 小A一秒按一次开关,一共按了m次。给出小A每次按下的开关编号,请问每一盏灯第一次关掉的时间。一开始,所有灯都是亮着的。
输入描述
输入第一行包含两个数,n,m 接下来一行m个数,代表小A每次按下的开关编号
输出描述
输出一行n个数,代表每盏电灯最后关掉的时间。
样例输入
4 2
2 1
样例输出
2 1 1 1
解题思路
如果当前数字比前面的数字大是无效的,因为无法覆盖。所以判断一下大小即可。
AC代码
时间复杂度O(n+m)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,a[maxn],b[maxn],cnt=0;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
int pos=n+1;
for(int i=1;i<=m;i++){
if(i!=1&&a[i]>pos)continue;//如果当前值大于前面的值,那么此次操作不影响结果
for(int j=a[i];j<pos;j++){//取啊a[i]后面所有没被关掉的灯。
b[j]=i;//第i秒
}
pos=a[i];
}
for(int i=1;i<=n;i++){
if(i==n)cout<<b[i];
else
cout<<b[i]<<" ";//输出答案即可。
}
}