• P1540 [NOIP2010 提高组] 机器翻译(模拟)


    [NOIP2010 提高组] 机器翻译

    题目背景

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

    题目描述

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

    假设内存中有 M M M 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M − 1 M-1 M1,软件会将新单词存入一个未使用的内存单元;若内存中已存入 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
    • 2

    样例输出 #1

    5
    
    • 1

    提示

    样例解释

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

    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 N5
    • 对于 100 % 100\% 100% 的数据有 1 ≤ M ≤ 100 1 \leq M \leq 100 1M100 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1N1000

    模拟水题

    用队列实现替换操作,可以单独开一个桶储存当前有哪些单词(甚至你 O ( n ) O(n) O(n)扫一遍队列也不会超时)

    #include
    #include
    #include
    #include
    #include
    using namespace std;
    const int N=1e4+23;
    int n,m,ans=0;
    int a[N],len=0;
    int ma[N];
    queue<int> q;
    int main(){
    //	freopen("translate.in","r",stdin);
    //	freopen("translate.out","w",stdout);
    	cin>>m>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	for(int i=1;i<=n;i++){
    		if(len<m){
    			if(ma[a[i]]==0){
    				ma[a[i]]=1;
    				len++;
    				q.push(a[i]);
    				ans++;
    			}
    		}
    		else {
    			if(ma[a[i]]==0){
    				int tmp=q.front();
    				ma[tmp]=0;
    				ma[a[i]]=1;
    				q.pop();
    				q.push(a[i]);
    				ans++;
    			}
    		}
    		//cout<
    	}
    	cout<<ans<<endl;
    //	fclose(stdin);
    //	fclose(stdout);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    封面

    请添加图片描述

  • 相关阅读:
    【jvm优化超详细】常见的JVM调优场景
    Adapter 适配器模式简介与 C# 示例【结构型1】【设计模式来了_6】
    【Linux】进程_8
    MFC消息映射【整理】
    Ros1 学习12- tf坐标系广播与监听的编程实现
    双十一蓝牙耳机什么牌子的好用?好用的蓝牙耳机推荐
    2022_08_06__106期__二叉树
    python线程类改变类变量
    【Redis】几款redis可视化工具(推荐Another Redis Desktop Manager)
    HAProxy的详解和使用
  • 原文地址:https://blog.csdn.net/CH_canghan/article/details/133468614