diff --git a/caching-offline/caching-offline.pdf b/caching-offline/caching-offline.pdf index 5ed04af..098131d 100644 Binary files a/caching-offline/caching-offline.pdf and b/caching-offline/caching-offline.pdf differ diff --git a/caching-offline/problem.json b/caching-offline/problem.json index 52eb09d..b147c16 100644 --- a/caching-offline/problem.json +++ b/caching-offline/problem.json @@ -44,7 +44,7 @@ "solutions": { "main-ac": "ac.cpp", "alternative-ac": [], - "wrong-answer": ["wa.cpp"], + "wrong-answer": ["wa.cpp", "wa_LFU.cpp", "wa_LRU.cpp"], "time-limit": [], "time-limit-or-ac": [], "time-limit-or-memory-limit": [], diff --git a/caching-offline/src/wa_LFU.cpp b/caching-offline/src/wa_LFU.cpp new file mode 100644 index 0000000..4e38fc2 --- /dev/null +++ b/caching-offline/src/wa_LFU.cpp @@ -0,0 +1,49 @@ +#include + +#define MAX_PAGE 1010 + +using namespace std; + +vector pages; +unordered_set cache; +vector referencesCount; + +int getLeastFrequentlyUsedPage() { + int lfuCount = INT_MAX, lfuPage = -1; + for (const int page : cache) { + if (referencesCount[page] < lfuCount) { + lfuPage = page; + lfuCount = referencesCount[page]; + } + } + return lfuPage; +} + +int main(){ + int k, v; cin >> k >> v; + + pages.resize(v); + for (int i = 0; i < v; i++) { + cin >> pages[i]; + } + + int misses = 0; + referencesCount.resize(MAX_PAGE, 0); + for (int i = 0; i < v; i++) { + if (!cache.count(pages[i])) { + bool isCacheFull = cache.size() == k; + if (isCacheFull) { + cache.erase(getLeastFrequentlyUsedPage()); + } + misses++; + cache.insert(pages[i]); + referencesCount[pages[i]] = 1; + } else { + referencesCount[pages[i]]++; + } + } + + cout << misses << endl; + + return 0; +} \ No newline at end of file diff --git a/caching-offline/src/wa_LRU.cpp b/caching-offline/src/wa_LRU.cpp new file mode 100644 index 0000000..1569dba --- /dev/null +++ b/caching-offline/src/wa_LRU.cpp @@ -0,0 +1,47 @@ +#include + +#define MAX_PAGE 1010 + +using namespace std; + +vector pages; +unordered_set cache; +vector lastReference; + +int getLeastRecentlyUsedPage() { + int lruTime = INT_MAX, lruPage = -1; + for (const int page : cache) { + if (lastReference[page] < lruTime) { + lruPage = page; + lruTime = lastReference[page]; + } + } + return lruPage; +} + +int main(){ + int k, v; cin >> k >> v; + + pages.resize(v); + for (int i = 0; i < v; i++) { + cin >> pages[i]; + } + + int misses = 0; + lastReference.resize(MAX_PAGE, -1); + for (int i = 0; i < v; i++) { + if (!cache.count(pages[i])) { + bool isCacheFull = cache.size() == k; + if (isCacheFull) { + cache.erase(getLeastRecentlyUsedPage()); + } + misses++; + cache.insert(pages[i]); + } + lastReference[pages[i]] = i; + } + + cout << misses << endl; + + return 0; +} \ No newline at end of file