模擬 機器翻譯

2021-08-29 01:52:22 字數 1652 閱讀 1807

大概題意:有m個單元均可存放一單詞。但出現單元裡面沒有的新單詞時,查詢一次,如果當前記憶體中已存入的單詞數不超過m-1,自動儲存在後面;若記憶體中已存入m個單詞,清空最早儲存的單詞,來存放新單詞。

長度為n個單詞。需要查詢多少次詞典?

思路很簡單,先暴力搜尋,沒有就考慮加入單元,沒滿直接加後面,滿了從已經刪除的地方+1開始刪除,這個地方肯定是單元裡面現有的最先進來的,替代它就好。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf = 0x3f3f3f3f;

struct dir

else

}};int main()

else

} cout《下面開始膜大佬

引用**

先開兩個陣列,乙個陣列a存標記,在讀入單詞x時,若當前陣列a中的第x位的標記為「1」,則表示該單詞在記憶體中,若標記為「0」,則表示該單詞不在記憶體中,這樣做就可以一步判斷讀入的單詞在當前是否在記憶體中,而不必從頭到尾找。這樣做還有乙個好處,在存入單詞時只需要把陣列a中的第x位的標記「0」改為「1」,而在刪去記憶體中的單詞x時,只需要把陣列a的第x位的標記「1」改為「0」,這樣就可以做到一步到位,大大降低時間複雜度,提高程式效率。這是本題的關鍵之一,需要各位好好體會體會,理解理解。

再說另乙個陣列b。陣列b儲存的是記憶體中的單詞,而且要按讀入順序存入,如b[1]中儲存的單詞x是在時間1存入的。要注意的是,若當前讀入的單詞x已經在記憶體中(即a[x]==1)那就不用存入陣列b中,遇到記憶體中沒有的新單詞才存入。

接下來要講指標。指標有兩個,乙個是l,指向當前記憶體中的單詞中最先乙個存入的,如b[l]是當前記憶體中第乙個存入的。另乙個是r,指向當前記憶體中的單詞中最後乙個存入的,如b[r]是當前記憶體中最後乙個存入的。所以,陣列b的第l位到第r位儲存的就是當前記憶體中的單詞。

遇到新單詞時(即a[x]==0),情況有兩種:

1.記憶體沒被用完(即r<=m)。此時指標r向右移一位,在b[r]中存入新單詞,並在陣列a中把單詞x的標記改為1;

2.記憶體已滿(即r>m)。此時先刪去當前記憶體中最先存入的單詞(b[l])。刪除操作不用太複雜,只需要先把指標l向右移一位,然後再修改a陣列的第b[l]位的標記就可以了,可聯絡上文加深理解。不要忘了最後在b[r]中存入新單詞x。

這題大概就是這樣做了,如果你感覺可以自己ac掉,就先不要看以下程式,自己試著打打程式。如果wa了就再認真看看上文,如果ac了就把你的程式和以下程式對比對比,看看有什麼可以改進的地方。

**如下:

#include #include #include using namespace std;

int n,m,x,ans,l,r,a[1005],b[1005];

int main()}}

cout

}

noip2010 機器翻譯 (模擬)

p1774機器翻譯 accepted 標籤 模擬 noip提高組2010 小晨的電腦上安裝了乙個機器翻譯軟體,他經常用這個軟體來翻譯英語文章。這個翻譯軟體的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對於每個英文單詞,軟體會先在記憶體中查詢這個單詞的中文含義,如果記憶體中有...

NOIP 2011機器翻譯 模擬

題目大意 給出兩個數字m,n,表示記憶體容量和文章長度,如果文章長度一樣就沒事,不一樣就往字典裡面新增,字典一共可以放 m個文章,放完以後就把最先放進來的踢出去自己鑽進來。題目思路 先入先出,剛開始我想到的也是佇列,看到群裡有大佬也這麼寫,我當初是在遍歷佇列元素這裡卡了,因為我檢驗在不在佇列裡的思路...

模擬 P1540 機器翻譯

題目連線 小晨的電腦上安裝了乙個機器翻譯軟體,他經常用這個軟體來翻譯英語文章。這個翻譯軟體的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換。對於每個英文單詞,軟體會先在記憶體中查詢這個單詞的中文含義,如果記憶體中有,軟體就會用它進行翻譯 如果記憶體中沒有,軟體就會在外存中的詞典...