首页 > 试题广场 >

机器翻译

[编程题]机器翻译
  • 热度指数:5050 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}牛牛的电脑上安装了一个机器翻译软件,它依次将每个英文单词替换为对应的中文含义。软件内部有 M 个缓存单元,每个单元存放一个单词和译义。翻译某个单词时:
\hspace{23pt}\bullet\,如果缓存中已有该单词,则直接使用(缓存命中);
\hspace{23pt}\bullet\,否则需要到外存词典查找(缓存未命中),并将该单词及译义插入缓存:若缓存未满,则占用一个空闲单元;若缓存已满,则清除最早进入缓存的单词后插入新单词。
\hspace{15pt}给定长度为 N 的文章(由 N 个整数编码表示单词),初始缓存为空,统计翻译过程中需要查词典的次数。

输入描述:
\hspace{15pt}第一行输入两个整数 M,N1 \leqq M \leqq 1001 \leqq N \leqq 1000),分别表示缓存容量和文章单词数。
\hspace{15pt}第二行输入 N 个整数 w_1,w_2,\dots,w_N0 \leqq w_i \leqq 1000),表示文章中按顺序出现的单词编码。


输出描述:
\hspace{15pt}输出一个整数,表示翻译过程中缓存未命中(查词典)的总次数。
示例1

输入

3 7
1 2 1 5 4 4 1

输出

5

说明

翻译过程示例(缓存状态记录自左向右为最早到最近):
初始:空
1: miss,缓存->[1]
2: miss,缓存->[1,2]
1: hit,缓存->[1,2]
5: miss,缓存->[1,2,5]
4: miss,缓存->[2,5,4](替换1)
4: hit,缓存->[2,5,4]
1: miss,缓存->[5,4,1](替换2)
共 miss 5 次。

备注:

#include <iostream>
using namespace std;
#include <vector>
#include <queue>
#include <algorithm>
int main(){
    int M, N;
    vector<int> v;
    vector<int> cache;
    cin >> M >> N;
    int num, count = 0;
    for(int i = 0; i < N; ++i){
        cin >> num;
        v.push_back(num);
    }
    for(const auto& val : v){
        vector<int>::const_iterator it = find(cache.begin(), cache.end(), val);
        if(it == cache.end()){
            if(cache.size() < M) cache.push_back(val);
            else{
                cache.erase(cache.begin());
                cache.push_back(val);
            }
            count++;
        }
    }
    cout << count << endl;
    return 0;
}

发表于 2026-01-16 22:16:01 回复(0)
由于本题在队列的题里,所以用队列做的
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
queue<int>q;
int m,n,x;
bool find(int x)
{
    bool ju=0;
    if (q.empty()) return 0;
    int l=q.size();
    for (int i=0;i<l;++i)
    {
        if (q.front()==x)
        {
            ju=1;
        }
        q.push(q.front());
        q.pop();
    }
    return ju;
}
int main() {
    int ans=0,now=0;
    cin>>m>>n;
    while(n--)
    {
        cin>>x;
        if(!find(x)) 
        {
            // W1W2YYMW5W4W4YM5
            // W1W2YYMW5W4YMW15
            q.push(x);
            ans++;
            now++;
            if (now>m)
            {
                q.pop();
                now--;
            }
        }
    }
    cout<<ans;
}
// 64 位输出请用 printf("%lld")


发表于 2025-12-22 23:42:53 回复(0)
m, n = map(int, input().strip().split())
w, t, c = list(map(int, input().strip().split())), [], 0
for i in w:
    if i in t:
        continue
    else:
        if len(t) >= m:
            t.pop(0)
        c += 1
        t.append(i)
print(c)

发表于 2025-11-26 10:00:57 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main() {
    int m,n,count=0;
    cin>>m>>n;
    set<int> a;
    queue<int>b;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;  
        if(a.count(x)) continue;    
            int t=a.size();
            b.push(x);
            a.insert(x);
            if(a.size()!=t)
            {
                count++;
                t=a.size();
            }
            if(a.size()>m)
            {
                int c=b.front();
                a.erase(c);
                b.pop();
            }      
    }
cout<<count;
}
发表于 2026-03-03 11:17:36 回复(0)
//创建一个队列,遍历所给数组,如果队列中没有则出队且入队新元素同时计数器加一,有的话则不做操作
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a = in.nextInt();
        Queue<Integer> queue =  new ArrayDeque<>();
        int[] b = new int[in.nextInt()];
        int chazhaoci = 0;
        for (int i = 0; i < b.length; i++) {
            b[i] = in.nextInt();
        }
        for (int word : b) {
            if (queue.contains(word)) {
                continue;
            } else {
                chazhaoci++;
                if (queue.size() == a) {
                    queue.poll();
                }
                queue.add(word);
            }
        }
        System.out.println(chazhaoci);
    }
}
发表于 2026-02-28 17:54:31 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,miss_count=0;
cin>>m>>n;
vector<bool>in_cache(1001,false);
queue<int>q;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(!in_cache[x]){
in_cache[x]=true;
if(q.size()>=m){
int old_word = q.front();
in_cache[old_word] = false;
q.pop();
}
q.push(x);
miss_count++;
}
}
cout<<miss_count<<endl;
}
发表于 2026-02-27 17:42:47 回复(0)
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;

int main() {
    int M, N;
    cin >> M >> N;

    unordered_set<int> cache;        // 用于快速查找(O(1)时间复杂度)
    queue<int> fifo_queue;           // 用于维护FIFO顺序
    int miss_count = 0;

    for (int i = 0; i < N; i++) {
        int word;
        cin >> word;

        // 如果单词不在缓存中(缓存未命中)
        if (cache.find(word) == cache.end()) {
            miss_count++;

            // 如果缓存已满,需要移除最早进入的单词
            if (cache.size() >= M) {
                int oldest = fifo_queue.front();
                fifo_queue.pop();
                cache.erase(oldest);
            }

            // 将新单词加入缓存
            cache.insert(word);
            fifo_queue.push(word);
        }
        // 如果单词在缓存中(缓存命中),不需要任何操作
    }

    cout << miss_count << endl;
    return 0;
}

发表于 2026-02-23 22:02:44 回复(0)
发表于 2026-02-17 23:28:25 回复(0)
各位大佬,我有个想法来实现这个题,就是滑动窗口去重加上滑动次数
注意!!!以下想法仅仅理论成立,代码部分有bug,具体bug是deque的溢出风险,因为pop了元素,所以后续访问必溢出,主包尝试改动,但能力有限,望周知
step1:去重(找每个数前N个数是否有一样的)
1,2,1(弹出),5,4,4(弹出),1
1,2,5,4,1(弹出两个数count=2)

for(int line = 0;line<M;line++)
    {
        int input;std::cin>>input;
        due.push_back(input);
        int step=std::max((int)line-N,0);
        int mark=0;
        for(int endWin=std::max(line-mark-1,0);endWin>step;endWin--)
        {
            if(due[line-mark]==due[endWin])
            {
                due.pop_back();
                mark++;
                count++;
                break;
            }
        }
    }

step2:计算滑动次数(窗口大小为“3”)
滑动3次count+3=5
count+=(due.size()>N? due.size()-N+1:due.size());
以下代码是主包正确AC解法
#include<iostream>
#include<deque>
#define NT std::endl

int main() {
	int N, M;
	std::cin >> N >> M;
	if (N == 0) {
		std::cout << 0;
		return 0;
	}
	std::deque<int>deq;
	int input, count = 1;
	std::cin >> input; M--; deq.push_back(input);
	while (M-- > 0){
		bool judge = false;
		std::cin >> input;
		for (int i = 0; i < deq.size(); i++) {
			if (deq[i] == input) {
				judge = true;
				break;
			}
		}
		if (judge == false) {
			if (deq.size() == N) {
				deq.pop_front();
				deq.push_back(input);
				count++;
			}
			else {
				deq.push_back(input);
				count++;
			}
		}
		judge = false;
	}
	std::cout << count;
}


发表于 2026-02-07 22:48:25 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int m,n;
        Queue<Integer> queue = new LinkedList<>();
        m = in.nextInt();
        n = in.nextInt();
        int ans = 0;
        while(n-->0){
            int temp = in.nextInt();
            if(!queue.contains(temp)){
                queue.offer(temp);
                if(queue.size()>m)queue.poll();
                ans++;
            }
        }
        System.out.println(ans);
    }
}

发表于 2026-02-05 18:19:21 回复(0)
M, N = map(int, input().split())
queue = list(map(int, input().split()))
huancun_list = []
count = 0
for _ in range(N):
    if (queue[0] not in huancun_list) & (len(huancun_list) < M):
        huancun_list.append(queue[0])
        queue.pop(0)
        count += 1
    elif (queue[0] in huancun_list) & (len(huancun_list) < M):
        queue.pop(0)
        continue
    elif (queue[0] not in huancun_list) & (len(huancun_list) >= M):
        huancun_list.pop(0)
        huancun_list.append(queue[0])
        queue.pop(0)
        count += 1
    elif (queue[0] in huancun_list) & (len(huancun_list) >= M):
        queue.pop(0)
        continue
print(count)

发表于 2026-01-28 12:08:39 回复(0)
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int session = in.nextInt();
        int n = in.nextInt();
        in.nextLine();
        int cnt = 0;
        Queue<Integer> q = new LinkedList<>();
        for(int i=0;i<n;i++){
            int a = in.nextInt();
            if(q.isEmpty()){
                q.offer(a);
                cnt++;
            }else{
                if(!q.contains(a)){
                    if(q.size()>=session){
                        q.poll();
                    }
                    q.offer(a);
                    cnt++;
                }
            }
        }
        in.nextLine();
        System.out.print(cnt);
    }
}
发表于 2025-12-25 16:16:56 回复(0)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
    queue<ll>qu;
    unordered_set<ll>st;
    ll M,N;
    cin>>M>>N;
    ll sum=0;
    while(N--){
        ll w;
        cin>>w;
        if(qu.empty()) {
          qu.push(w);
          st.insert(w);
          sum++;
          }
        else{
            if(st.find(w)==st.end()&&qu.size()<M){
              qu.push(w);
              st.insert(w);
              sum++;
            }
            else if(st.find(w)==st.end()&&qu.size()==M){
                ll tem=qu.front();
                qu.pop();
                st.erase(tem);
                qu.push(w);
                st.insert(w);
                sum++;
            }
        }
    }
    cout<<sum<<endl;
    return 0;
}
发表于 2025-12-19 19:33:24 回复(0)
#include <iostream>
using namespace std;
#include<deque>
#include<vector>
bool isInCache(int a,deque<int>d){
      for(int i=0;i<d.size();i++){
           if(a==d[i]){
               return 1;
           }
      }
      return 0;
}
int main() {
   int M,N;
   cin>>M>>N;
    vector<int>v;
   for(int i=0;i<N;i++){
        int a;
        cin>>a;
        v.push_back(a);
   }
   int miss=0;
   deque<int>d;
   for(int i=0;i<v.size();i++){
           if(isInCache(v[i],d)){
                 continue;
           }
           else if(!isInCache(v[i],d)){
            miss++;
                if(d.size()==M){
                    d.pop_front();
                    d.push_back(v[i]);
                }
                else{
                    d.push_back(v[i]);
                }
           }
         }
         cout<<miss;
   }

// 64 位输出请用 printf("%lld")

发表于 2025-12-06 21:03:52 回复(0)
#include <stdint.h>
#include <stdio.h>

int main() {
    int M,N,miss=0;
    scanf("%d%d",&M,&N);
    int queue[M],front=0;
    for(int i=0;i<N;i++){
        int x;
        scanf("%d",&x);
        for(int j=0;j<front;j++){
            if(x==queue[j]){
                goto ta;              
            }
        }
        if(front<M) {
            queue[front++]=x;
            miss++;
        }
        else{int temp=x;
            for(int u=0;u<M-1;u++){
                queue[u]=queue[u+1];
            }
            queue[M-1]=x;
            miss++;
        }
    ta: continue;
    }
    printf("%d",miss);
    return 0;
}
发表于 2025-11-28 00:03:55 回复(0)
m,n = map(int,input().split())
w = list(map(int,input().split()))
list_w = []
cnt = 0
for i in w:
    if i not in list_w:
        cnt += 1
        if len(list_w) == m:
            list_w.pop(0)
            list_w.append(i)
        if len(list_w) < m:
            list_w.append(i)
    else:
        continue
print(cnt)

发表于 2025-11-21 14:33:57 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main() {
    int M, N, w, count = 0;
    cin >> M >> N;
    queue <int> q, temp;
    bool h = false;
    while (N--) {
        h = false;
        cin >> w;
        while (!q.empty()) {
            if (q.front() == w)
                h = true;
            temp.push(q.front());
            q.pop();
        }
        while (!temp.empty()) {
            q.push(temp.front());
            temp.pop();
        }
        if (!h) {
            if (q.size() == M)
                q.pop();
            q.push(w);
            count++;
        }
    }
    cout << count;
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-11-12 17:23:32 回复(0)
class Queue:
    def __init__(self):
        self.in_stack: list[int] = []
        self.out_stack: list[int] = []

    def push(self, x: int):
        self.in_stack.append(x)

    def _dump_if_needed(self):
        if not self.out_stack:
            while self.in_stack:
                self.out_stack.append(self.in_stack.pop())

    def pop(self) -> int:
        if self.isEmpty():
            raise IndexError("pop from an empty queue")

        self._dump_if_needed()

        return self.out_stack.pop()

    def query(self) -> int:
        if self.isEmpty():
            raise IndexError("pop from an empty queue")

        self._dump_if_needed()

        return self.out_stack[-1]

    @property
    def size(self) -> int:
        return len(self.in_stack) + len(self.out_stack)

    def isEmpty(self) -> bool:
        return not self.in_stack and not self.out_stack

    def __len__(self) -> int:
        return self.size
    
    def __contains__(self, x : int) -> bool:
        return x in self.in_stack&nbs***bsp;x in self.out_stack

def totalQuery(M : int, words : list[int]) -> int:
    vocab = Queue()
    total_number_of_query = 0
    for word in words:
        if word not in vocab:
            total_number_of_query += 1
            if vocab.size >= M:
                vocab.pop()
            vocab.push(word)

    return total_number_of_query

def main():
    M, N = map(int, input().split())
    words = list(map(int, input().split()))
    print(totalQuery(M, words))

if __name__ == "__main__":
    main()

发表于 2025-11-12 01:27:51 回复(0)
#include <iostream>
using namespace std;
int vis[1002],
    temp[1002]; //vis指这个数字是否已经缓存;temp指目前最新的存储单词;
int main() {
    int M, count = 0, N, tempPos = 0; //M,N题目已经给出,count指已经存储几个数据,tempPos表示temp开到几;
    cin >> M >> N;
    int op, sum = 0; //op为当前输入序号,sum指查过几次;
    while (N--) {
        cin >> op;
        if (vis[op] == 1) {
            continue;//已经缓存,次数加1后,直接下一轮;
        }
        sum++;
        if (count >= M) {
            vis[temp[tempPos - M]] = 0; //不断的更新temp库元素;
            vis[op] = 1;
            temp[tempPos++] = op;
        } else {
            vis[op] = 1;
            temp[tempPos++] = op;
            count++;
        }
    }
    cout << sum << endl;
    return 0;
}
// 64 位输出请用 printf("%lld")
发表于 2025-10-15 16:58:21 回复(0)
# 小白版本

a,b = map(int, input().split())

nums = list(map(int,input().split()))
stack=[]
res = 0
for aaa in nums:
    if aaa in stack:
        # res+= 1
        continue
    elif len(stack)<a:
        res+=1
        stack.append(aaa)
    else:
        stack.pop(0)
        res+=1
        stack.append(aaa)
print(res)

发表于 2025-09-06 23:32:22 回复(0)