洛谷:P1540 [NOIP2010 提高组] 机器翻译

[NOIP2010 提高组] 机器翻译

题目背景

NOIP2010 提高组 T1

题目描述

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

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

假设一篇英语文章的长度为 N N N 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

输入格式

共 2 2 2 行。每行中两个数之间用一个空格隔开。

第一行为两个正整数 M , N M,N M,N,代表内存容量和文章的长度。

第二行为 N N N 个非负整数,按照文章的顺序,每个数(大小不超过 1000 1000 1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出格式

一个整数,为软件需要查词典的次数。

样例 #1

样例输入 #1

复制代码
3 7
1 2 1 5 4 4 1

样例输出 #1

复制代码
5

提示

样例解释

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:

  1. 1:查找单词 1 并调入内存。
  2. 1 2:查找单词 2 并调入内存。
  3. 1 2:在内存中找到单词 1。
  4. 1 2 5:查找单词 5 并调入内存。
  5. 2 5 4:查找单词 4 并调入内存替代单词 1。
  6. 2 5 4:在内存中找到单词 4。
  7. 5 4 1:查找单词 1 并调入内存替代单词 2。

共计查了 5 5 5 次词典。

数据范围

  • 对于 10 % 10\% 10% 的数据有 M = 1 M=1 M=1, N ≤ 5 N \leq 5 N≤5;
  • 对于 100 % 100\% 100% 的数据有 1 ≤ M ≤ 100 1 \leq M \leq 100 1≤M≤100, 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1≤N≤1000。

提交代码

c 复制代码
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int quee[N]={-1}, a[N], n, m;
int l, k,sum;
bool flag = false;
int main()
{
	cin >> n >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> a[i];
		if (a[i] == 0)
			a[i] = -1;
	}
	for (int i = 0; i < m; i++)
	{
		flag = false;
		for (int j = l; j < n; j++)
		{
			if (a[i] == quee[j])
			{
				flag = true;
				break;
			}
		}
		if (!flag)
		{
			quee[k++] = a[i];
			sum++;

		}
		if (k > n)
		{
			quee[l++] = -1;
			n++;
		}
	}
	cout << sum << endl;
	return 0;
}

代码思路总结

  • 输入处理
    • 读取内存容量 n 和文章长度 m
    • 读取文章中的单词序列 a[],并将值为 0 的单词替换为 -1(为了避免与未初始化的队列元素冲突)。
  • 逻辑处理
    • 遍历文章中的每个单词:
      • 检查当前单词是否已经在内存队列 quee[] 中。
      • 如果单词不在内存中,则将其加入队列,并增加查词典次数 sum
      • 如果队列已满(k > n),则移除最早进入队列的单词(通过移动左指针 l)。
  • 输出结果
    • 输出查词典的总次数 sum

算法刷题记录

相关推荐
长空任鸟飞_阿康6 分钟前
Node.js 核心模块详解:fs 模块原理与应用
前端·人工智能·ai·node.js
可触的未来,发芽的智生10 分钟前
触摸未来2025-10-18:生成文字的小宇宙矩阵溯源
人工智能·python·神经网络·程序人生·自然语言处理
_码力全开_12 分钟前
P1005 [NOIP 2007 提高组] 矩阵取数游戏
java·c语言·c++·python·算法·矩阵·go
墨染点香16 分钟前
LeetCode 刷题【124. 二叉树中的最大路径和、125. 验证回文串】
算法·leetcode·职场和发展
Camel卡蒙16 分钟前
红黑树详细介绍(五大规则、保持平衡操作、Java实现)
java·开发语言·算法
武子康19 分钟前
AI-调查研究-106-具身智能 机器人学习数据采集工具和手段:传感器、API、遥操作、仿真与真人示教全流程
人工智能·深度学习·机器学习·ai·系统架构·机器人·具身智能
Python智慧行囊21 分钟前
图像处理-opencv(一)
人工智能·opencv·计算机视觉
AhriProGramming27 分钟前
Flask-SQLAlchemy精读-双语精选文章
python·算法·flask
StarPrayers.35 分钟前
损失函数(Loss Function)、反向传播(Backward Propagation)和优化器(Optimizer)学习笔记
人工智能·笔记·深度学习·学习
IT_陈寒39 分钟前
Vite 5个隐藏技巧让你的项目构建速度提升50%,第3个太香了!
前端·人工智能·后端