题解 | #机器翻译#

机器翻译

https://ac.nowcoder.com/acm/problem/16589

模拟这个过程

solution 1

判断单词是否在内存之中,我们用数组实现。如果以单词值为下标的数组vis值不为0,则表示这个单词在内存之中,遇到同样的单词,下标相同,数组元素值相同不为0,则不需要从外存词典读入。则实现了单词是否在内存的判断。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    int vis[1111]={0} ;
    //vis代表内存
    int acc=0;//外存读取次数
    for (int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);
        if (vis[x] != 0) continue;
        //如果单词x对应的vis【x】不为0则代表内存当中含有这个单词
        //
        else {
            acc++;
            
            if (m > 0)
            //控制内存是否满了
            {
                vis[x] = i;//没在内存,要从外存读入,我们就让vis【x】的值为单词x从外存读入内存的时间(i)
                m--;
            } 
            //如果内存满了,就执行的操作,替换内存相对较早读入的单词,
            else {
                int min = i;
                int pos;
                for (int j = 0; j <= 1000; j++) {
                    if(vis[j]<min&&vis[j]!=0)
                    {
                        min=vis[j];
                        pos=j;
                    }
                }
                vis[x]=i;
                vis[pos]=0;
            }
        }
    }
    printf("%d",acc);
    return 0;
}

solution 2

#include <stdio.h>
#include <stdlib.h>
int m, n;

int main() {
    scanf("%d %d", &m, &n);
    int data[1200];
    int vis[1200] = {0};//判断是否在内存之中
    int temp[1200];//如果向内存中读入一个单词 data[i],就记录data[i]
    int te=0,te2=0;//te2表示按照时间顺序读取读取在较早读入内存之中的单词
    int acc=0;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &data[i]);
        if (vis[data[i]] != 0) continue;
        else {
            acc++;
            if (m > 0) {
                vis[data[i]] = 1;
                temp[te++]=data[i];
                m--;
            } else {
                vis[data[i]]=1;
                vis[temp[te2++]]=0;
                temp[te++]=data[i];
            }
        }
    }
    printf("%d",acc);
    return 0;
}
全部评论

相关推荐

我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务