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

    题目背景

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

    题目描述

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

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

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

    输入输出格式

    输入格式:

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

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

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

    输出格式:

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

    输入输出样例

    输入样例#1: 复制
    3 7
    1 2 1 5 4 4 1
    
    输出样例#1: 复制
    5


    本来想用队列来做 但是队列没有find 。。count 只有size
    然后强行模拟
    效率及其低下 o(nk)
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,x,y) for(int i=(x);i<=(y);++i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s)
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 10005
    #define inf -0x3f3f3f3f
    int main()
    {
     int k,n;
     RII(k,n);
     int a[N];
     int len=0;
     int cnt=0;
     rep(i,1,n)
     {
         int x;RI(x);
         int flag=0;
         rep(j,1,len)
         if(a[j]==x)flag=1;//找到了
         if(flag)continue;
         if(len<k)
         {
             a[++len]=x;
             cnt++;
         }
         else if(len==k)
         {
              cnt++;
              rep(j,1,len-1)
              a[j]=a[j+1];
              a[len]=x;
         }
     }
    cout<<cnt;
        return 0;
    }
    View Code

    有一种高效的方法就是用滑动窗孔维护 再加上哈希表 非常推荐!

    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,x,y) for(int i=(x);i<=(y);++i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s)
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 1005
    #define inf -0x3f3f3f3f
    
    int ha[N];
    int letter[N];
    int main()
    {
        int k,n;
        RII(k,n);
        int left=0;
        int right=0;
        int cnt=0;
        rep(i,1,n)
        {
            int x;
            RI(x);
            if(!ha[x])
            {   cnt++;
                ha[x]=1;
                letter[right++]=x;
                
                if(right-left>k)
                    ha[ letter[left++] ]=0;
            }
        }
        cout<<cnt;
        return 0;
    }
    View Code

    还有就是灵活使用STL 

    之前都不知道vector里面有find

    不是专属于vector的    是顺序查找的快捷写法  

    STL中  set和string自带find   set里的find肯定是二分

    STL写法的时间复杂度和第一个一样  但是最好写

    要学会灵活使用erase和find

    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,x,y) for(int i=(x);i<=(y);++i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s)
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 1005
    #define inf -0x3f3f3f3f
    vector<int>s;
    int main()
    {
        int k,n;
        RII(k,n);
        int cnt=0;
        rep(i,1,n)
        {
            int x;
            RI(x);
            if(find(s.begin(),s.end(),x)==s.end())
            {
                cnt++;
                s.push_back(x);
                if(s.size()>k)
                 s.erase(s.begin());
            }
        }
        cout<<cnt;
        return 0;
    }
    View Code




  • 相关阅读:
    升/降压转换器 (Buck-boost)
    升压转换器 (Boost)
    降压转换器 (Buck)
    线性稳压器 (LDO)
    电源管理组件选择指南
    AC/DC 反激 (Flyback) 控制器
    SEPIC 单端初级电感转换器 稳压器 -- Zeta 转换器
    LT3759 宽输入电压范围升压 / 负输出 / SEPIC 控制器 可在输入电压低至 1.6V 的情况下工作
    LT1961 升压型稳压器造就了兼具升压和降压能力的扁平状SEPIC
    Level-shifting nixes need for dual power supply
  • 原文地址:https://www.cnblogs.com/bxd123/p/10509947.html
Copyright © 2011-2022 走看看