题目链接:https://www.jisuanke.com/contest/7964?view=challenges
题目意思:就是页面加载到一个个窗口中,这些窗口就像时钟一样首尾连续不过周期是给输入的,加载页面有一些规则(在思路中,当时愣是没懂这些规则的意思)。
题目思路:首先判断要加载页面是否在这n个空格中:
加载规则如下:
1.当有空位置时,将空位置加载为a[i],flag设为new。
2.当没有时,判断指针所指页面的flag,如果flag==new,将指针后移,并将当前页面flag改为old(表示旧页面)如果页面的flag==old,则可以直接用将加载的页面替换当前页面,并将替换后页面的fla定为new。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn = 1e5 + 5; struct node{ ll x; ll flag;///1为新,0为旧 }N[maxn]; ll a[maxn]; int main(){ ll n, m, Case = 1; while(~scanf("%lld%lld",&n,&m)){ if(!n && !m) break; memset(a, 0, sizeof(a)); ll Count = 1, sum = 0; ///指针,计数 for(ll i = 1; i <= m; i++) scanf("%lld", &a[i]); for(ll i = 1; i <= n; i++){ N[i].x = 0; N[i].flag = 0; } printf("Program %lld\n", Case++); for(ll i = 1; i <= m; i++){ ll flag1 = 0; for(ll j = 1; j <= n; j++){ if(N[j].x == a[i]){ N[j].flag = 1; flag1 = 1; printf("Access page %lld in cell %lld.\n", a[i], j); sum++; } } if(flag1 == 1) continue; while(N[Count].flag == 1){ N[Count].flag = 0; printf("a[i] = %lld ;count = %lld \n",a[i],Count); Count++; if(Count == n + 1){ Count = 1; } } if(N[Count].flag == 0){ N[Count].x = a[i]; N[Count].flag = 1; printf("Page %lld loaded into cell %lld.\n", a[i], Count); Count++; if(Count == n + 1) Count = 1; } } printf("There are a total of %lld page faults.\n\n", m - sum); } return 0; }