UCF Local Programming Contest 2012(Practice) D. The Clock Algorithm

题目链接: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;
}

猜你喜欢

转载自www.cnblogs.com/Mingusu/p/12422815.html