题目描述:
题目解读:
"最近操作"字段会显示最近操作的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;
}
遇到的错误: