zoukankan      html  css  js  c++  java
  • P1540 机器翻译

    题目链接:https://www.luogu.org/problem/P1540

    https://ac.nowcoder.com/acm/contest/258/A

    题目背景

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

    题目描述

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

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

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

    输入格式

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

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

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

    输出格式

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

    输入输出样例

    输入 #1
    3 7
    1 2 1 5 4 4 1
    
    输出 #1
    5
    

    说明/提示

    每个测试点1s1s

    对于10\%10%的数据有M=1,N≤5M=1,N5。

    对于100\%100%的数据有0≤M≤100,0≤N≤10000M100,0N1000。

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

    空:内存初始状态为空。

    1.11:查找单词1并调入内存。

    2. 1 212:查找单词22并调入内存。

    3. 1 212:在内存中找到单词11。

    4. 1 2 5125:查找单词55并调入内存。

    5. 2 5 4254:查找单词44并调入内存替代单词11。

    6.2 5 4254:在内存中找到单词44。

    7.5 4 1541:查找单词1并调入内存替代单词22。

    共计查了55次词典。

    题解:模拟

              1.缓存存储方式--

                 先进先出

                 队列

               2.快速判断是否在缓存中存在bool st[1001]

                枚举每个单词

                1.如果单词已经在缓存中则pass

                2.否则,

                   (1):如果缓存不满,则直接插入

                   (2)   :如果缓存已满,则弹出队尾

     1 #include <iostream>
     2 #include <queue>
     3 using namespace std;
     4 const int N = 1007;
     5 int m,n;
     6 bool st[N];
     7 int main()
     8 {
     9     cin>>m>>n;
    10     queue<int>q;
    11     int res = 0;
    12     for(int i = 0; i < n; ++i)
    13     {
    14         int x;
    15         cin>>x;
    16         if(!st[x])  //该数据未存入内存
    17         {
    18             if(q.size() == m)  //如果内存已满
    19             {
    20                 int t = q.front();  //弹出
    21                 st[t] = false;     //标记该位置数据删除
    22                 q.pop();    //弹出
    23             }
    24             q.push(x);
    25             st[x] = true;   //标记该数据已经存入内存
    26             res++;   //查询次数 ++
    27         }
    28     }
    29     cout<<res<<endl;
    30     return 0;
    31 }
    View Code
    永远年轻 永远热泪盈眶!
  • 相关阅读:
    网站安全编程 黑客入侵 脚本黑客 高级语法入侵 C/C++ C# PHP JSP 编程
    【算法导论】贪心算法,递归算法,动态规划算法总结
    cocoa2dx tiled map添加tile翻转功能
    8月30日上海ORACLE大会演讲PPT下载
    【算法导论】双调欧几里得旅行商问题
    Codeforces Round #501 (Div. 3) B. Obtaining the String (思维,字符串)
    Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)
    Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle (数学,区间)
    洛谷 P1379 八数码难题 (BFS)
    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords (贪心)
  • 原文地址:https://www.cnblogs.com/Edviv/p/11414760.html
Copyright © 2011-2022 走看看