問題描述
小晨的電腦上安裝了一個機器翻譯軟體,他經常用這個軟體來翻譯英語文章,
這個翻譯軟體的原理很簡單,它只是從頭到尾,依次將每個英文單詞用對應的中文含義來替換,對于每個英文單詞,軟體會先在記憶體中查找這個單詞的中文含義,如果記憶體中有,軟體就會用它進行翻譯;如果記憶體中沒有,軟體就會在外存中的詞典內查找,查出單詞的中文含義然后翻譯,并將這個單詞和譯義放入記憶體,以備后續的查找和翻譯,
假設記憶體中有M個單元,每單元能存放一個單詞和譯義,每當軟體將一個新單詞存入記憶體前,如果當前記憶體中已存入的單詞數不超過M?1,軟體會將新單詞存入一個未使用的記憶體單元;若記憶體中已存入M 個單詞,軟體會清空最早進入記憶體的那個單詞,騰出單元來,存放新單詞,
假設一篇英語文章的長度為N個單詞,給定這篇待譯文章,翻譯軟體需要去外存查找多少次詞典?假設在翻譯開始前,記憶體中沒有任何單詞,
輸入
輸入檔案共2行,每行中兩個數之間用一個空格隔開,
第一行為兩個正整數M和N,代表記憶體容量和文章的長度,
第二行為N個非負整數,按照文章的順序,每個數(大小不超過1000)代表一個英文單詞,文章中兩個單詞是同一個單詞,當且僅當它們對應的非負整數相同,
對于10%的資料有M = 1,N ≤ 5,
對于100%的資料有0 < M ≤ 100,0 < N ≤ 1000,
輸出
共1行,包含一個整數,為軟體需要查詞典的次數,
樣例輸入
3 7 1 2 1 5 4 4 1
樣例輸出
1
代碼如下
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 queue<int> q;//佇列模擬記憶體情況 5 int m,n,ans; 6 bool inq[1010];//判斷單詞是否在記憶體中 7 int main() 8 { 9 cin>>m>>n; 10 for(int i=1;i<=n;i++) 11 { 12 int x; 13 cin>>x; 14 if(inq[x])continue;//能夠在記憶體中查找就跳過 15 else 16 { 17 //如果記憶體滿了,最早進入記憶體的那個單詞出列 18 if(q.size()>=m) 19 { 20 inq[q.front()]=false; 21 q.pop(); 22 } 23 //把外存的結果加入記憶體以便下次查找 24 q.push(x); 25 inq[x]=true; 26 ans++; 27 } 28 } 29 cout<<ans; 30 return 0; 31 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285767.html
標籤:其他
上一篇:時間輪演算法
下一篇:鏈表問題,如何優雅遞龜?
