做题笔记 指针(洛谷P1540 机器翻译 NOIP2010提高组)

题目传送门 P1540 机器翻译

在这里插入图片描述

思路分析

我们仔细看题目这一段

假设内存中有M个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1,软件会将新单词存入一个未使用的内存单元;若内存中已存入M个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

清空最早那个单词,存放新单词,我们用样例模拟一下就是这样
在这里插入图片描述
所以这题我们可以用指针
用指针l指最左边,r指最右边,存入一个单词后r++,如果r>m,那么左指针l所指的数清零,l++
这里开两个数组作内存,第一个数组a是类似一个桶,初始值为零,如果对应下标的数字存入b数组(b数组是内存)里,该数置为1,所以搜索输入的x时只需要判断a[x]即可

我们来看代码

#include<iostream>
using namespace std;
int a[1005],b[1005];    //a,b数组作用已经说过
int n,m,x;
int main(){
	cin>>m>>n;
	int l=0,r=0;    //指针初始化,这里很巧妙,至于为什么继续看下面的语句
	int ans=0;      //这个是计数器
	for(int i=1;i<=n;i++){
		cin>>x;     //我们边输入边做
		if(a[x]==0){    //判断有没有存过这个数
			r++;      //r要先++,再让b[r]=x,所以初始化时r要等于0,不然不好处理
			b[r]=x;    
			ans++;     //到这里为止查完一次字典所以计数器++
			a[x]=1;    //置为1表示查过了
			if(r>m) {  //r大于了内存范围,左边的指针就要挪一位
				l++;
				a[b[l]]=0;}    //虽然b数组并不是从0开始,但是由于l要++,所以l初始化要为0
		}
	}
	cout<<ans;
	return 0;   //代码没有return 0;你的成绩return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值