bzoj1826 貪心 快取交換

2021-08-19 04:54:10 字數 2033 閱讀 6102

description

在計算機中,cpu只能和快取記憶體cache直接交換資料。當所需的記憶體單元不在cache中時,則需要從主存裡把資料調入cache。此時,如果cache容量已滿,則必須先從中刪除乙個。

例如,當前cache容量為3,且已經有編號為10和20的主存單元。 此時,cpu訪問編號為10的主存單元,cache命中。

接著,cpu訪問編號為21的主存單元,那麼只需將該主存單元移入cache中,造成一次缺失(cache miss)。

接著,cpu訪問編號為31的主存單元,則必須從cache中換出一塊,才能將編號為31的主存單元移入cache,假設我們移出了編號為10的主存單元。

接著,cpu再次訪問編號為10的主存單元,則又引起了一次缺失。我們看到,如果在上一次刪除時,刪除其他的單元,則可以避免本次訪問的缺失。

在現代計算機中,往往採用lru(最近最少使用)的演算法來進行cache排程——可是,從上乙個例子就能看出,這並不是最優的演算法。

對於乙個固定容量的空cache和連續的若干主存訪問請求,聰聰想知道如何在每次cache缺失時換出正確的主存單元,以達到最少的cache缺失次數。

input

輸入檔案第一行包含兩個整數n和m(1<=m<=n<=100,000),分別代表了主存訪問的次數和cache的容量。

第二行包含了n個空格分開的正整數,按訪問請求先後順序給出了每個主存塊的編號(不超過1,000,000,000)。

output

輸出一行,為cache缺失次數的最小值。

sample input

6 2

1 2 3 1 2 3

sample output

hint

在第4次缺失時將3號單元換出cache。

題解

先離散化再貪心一下

設第i個位置下乙個相同的單元是nxt[i],如果沒有的話nxt[i]=n+1

那每次彈出肯定是彈出nxt[i]最大的

那你可以搞乙個可刪堆,維護nxt[i]

然後又是隨便做了。。

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct lsnodew[110000];

bool cmp(lsnode n1,lsnode n2)

void pop()

a.pop();

}void erase(node x)

node top()

return a.top();

}}q;int nxt[110000],las[110000];

int n,m,col[110000];

bool vis[110000];

int main()

memset(las,-1,sizeof(las));

for(int i=n;i>=1;i--)

memset(vis,false,sizeof(vis));

int ans=0,cnt=0,beg=-1;

for(int i=1;i<=n;i++)

vis[col[i]]=true;

ans++;cnt++;

node tmp;tmp.pla=nxt[i];

q.push(tmp);

}else

if(cnt==m)

}if(beg==-1)printf("%d\n",ans);

else

else

}printf("%d\n",ans);

}return

0;}

bzoj1826 JSOI2010 快取交換

傳送門 界定記憶體放進去還是出來的是他下一次出現的位置 沒有是n 1 顯然先出現的比後出現的更優。然後優先佇列水一波。include include include include include include include include using namespace std const i...

bzoj 1826 JSOI2010 快取交換

求最少的排程次數。貪心。假如對於乙個數,以後都沒有出現過,那麼一定可以換掉。而對於其他的,記錄下它下次出現的位置,那麼將最遠的換掉就可以了。正確性顯然。code include include include include include include include using namespa...

BZOJ 1826 JSOI2010 快取交換

時間限制 10 sec 記憶體限制 64 mb 提交 955 解決 516 提交 在計算機中,cpu只能和快取記憶體cache直接交換資料。當所需的記憶體單元不在cache中時,則需要從主存裡把資料調入cache。此時,如果cache容量已滿,則必須先從中刪除乙個。例如,當前cache容量為3,且已...