bxd123

题目背景

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

题目描述

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

假设内存中有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

 

 

 

 

 

 

 

 

 





分类:

技术点:

相关文章:

  • 2021-12-22
  • 2021-12-23
  • 2021-12-10
猜你喜欢
  • 2021-10-09
  • 2021-09-24
  • 2022-01-03
  • 2022-12-23
  • 2021-09-18
  • 2022-12-23
相关资源
相似解决方案