题目描述:


题目解读:
"最近操作"字段会显示最近操作的n个文件。
最初有编号文件1,2,... n在"最近操作"字段,还有其他无限多个文件不在。
当某个文件pi发生操作时:
如果它位于“最近操作”字段内,将从其位置移动到"最近操作"字段的顶部。
如果它不在“最近操作”字段内,将从外部添加到"最近操作"字段的顶部,并将字段最后一个文件删除出字段。
即将发生的的操作都发生在编号大于等于n+1的文件上。
输入两行数据
第一行,n和m分别代表 “最近操作”字段的大小 和 要执行的新操作个数。
第二行,包括m个新操作的具体文件编号p1-pm。
输出初始时n个文件,输出这n个文件第一次从“最近操作”字段内删除的时间,或输出-1表示它不会被删除。
解题思路:
思路一:
需要两个数组,一个记录当前“最近操作”字段内的文件编号,一个记录n个文件第一次从“最近操作”字段内删除的时间。
记录 当前“最近操作”字段内的文件编号 的数组先初始化为1-n,记录 第一次从“最近操作”字段内删除的时间 的数组元素都初始化为-1。
然后每输入一个新元素,先判断是否在“最近操作”字段数组内,在其实就不用执行操作;如果不在,则替换掉末尾的元素,并把末尾元素的时间更新。
这里需要额外设置一个变量,记录该替换第几个元素了。
替换时间根据i来即可。
代码实现:
//用来判断 新的输入 是否已经在“最近操作”数组中
int NotHave(int a,int n,int num[MAX]) {
int flag = 1;
for (int i = 1; i <= n; i++) {
if (num[i] == a) {
flag = 0;
break;
}
}
return flag;
}
void Solve() {
int n,m;
cin >> n >> m; //输入 最近操作字段的长度 和 新操作个数
int change=0;
int i;
int num[MAX]; //存储最近操作字段内的内容
int time[MAX]; //存储字段内容被替换掉的时间
int nums;
for (i = 1; i <= n; i++) { //初始化数组
num[i]=i;
time[i] = -1;
}
for (i = 1; i <= m; i++) { //输入
cin >> nums;
if (NotHave(nums,n,num) && change<=n){ //判断输入是否已经在数组内 并 判断是否还处于替换期
num[n-change] = nums; //替换
time[n-change] = i; //记录替换时间
change++; //替换数+1
}
}
for (i = 1; i <= n; i++) {
printf("%d ", time[i]);
}
printf("\n");
return;
}
int main() {
int t;
scanf("%d", &t);
while (t--) Solve();
return 0;
}
遇到的错误:



![2023《中国好声音》全国巡演Channel[V]歌手大赛广州赛区半决赛圆满举行!](https://img-blog.csdnimg.cn/img_convert/476a1dab1cb6a9d07d4997b2d14983e8.jpeg)


![[图表]pyecharts模块-日历图](https://img-blog.csdnimg.cn/ebf7e5b242b44bce97b4f06b6afd53dd.png#pic_center)






![[图表]pyecharts模块-柱状图2](https://img-blog.csdnimg.cn/c8b3348eeb34417cb2d867db12632e15.png#pic_center)

![【群智能算法改进】一种改进的算术优化算法 改进算术优化算法 改进AOA[1]【Matlab代码#37】](https://img-blog.csdnimg.cn/8e085f0699494594a1e2dad205f2b5a0.png#pic_center)



![[图表]pyecharts模块-反转柱状图](https://img-blog.csdnimg.cn/4dbc4820d0ab49eca91130697d661f76.png#pic_center)