zoukankan      html  css  js  c++  java
  • 西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数)

    链接:https://www.nowcoder.com/acm/contest/107/F
    来源:牛客网

    Operating System
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 131072K,其他语言262144K
    64bit IO Format: %lld

    题目描述

    在学习Operating System的过程中,Glory遇到了这样一个问题,现在有一个大小为可以容纳N个页面的内存,硬盘内的内容被分成M个页面,用1~M来标识,一开始内存里没有任何页面,接下来用户会请求Q个页面,你需要设计一个置换算法,使得缺页发生的次数最少。缺页是指用户请求某个编号的页面,但这个页面没有在内存中的情况。发生缺页之后,你必须要把硬盘内对应的页面调入内存中,如果内存已满,你需要置换掉当前内存中的某个页面。

    输入描述:

    多组数据,请处理到输入结束。
    每组数据,第一行为三个整数N,M,Q (0 < N,M,Q <= 50000)
    接下来一行Q个数,表示用户请求的页面编号。

    输出描述:

    对于每组数据,输出一个数,表示最少的缺页次数。
    示例1

    输入

    2 3 5
    3 1 2 1 2
    3 4 5 
    3 2 1 4 3

    输出

    3
    4
    有一种简单的方法,但不知道是为什么,大佬路过的话,可以帮忙回答一下
    我的麻烦思路:
    比如例1:

    先3 1,接下来在1之后遇到不是3,1,的开始找n个互不相同的,为2,1,所以要把3换成2,以此类推
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    int a[50005];
    bool v[50005];
    bool v1[50005];
    queue<int>q1;
    queue<int>q;
    int main()
    {
        int n,m,p;
        while(cin>>n>>m>>p)
        {
            long long s=0;
            memset(v,0,sizeof(v));
            for(int i=1;i<=p;i++)
                cin>>a[i];
     
            while(!q.empty())
                q.pop();
     
            int f1=0;
            bool ff=0;
            for(int i=1; i<=p; i++)
            {
                if(!v[a[i]])
                {
                    f1++;
                    memset(v1,0,sizeof(v1));
                    while(!q1.empty()) q1.pop();
                    q1.push(a[i]);
                    v1[a[i]]=1;
                    int k=1;
                    int j;
                    for(j=i+1;j<=p;j++)
                   {
                       if(!v1[a[j]])
                       {
                           v1[a[j]]=1;
                           q1.push(a[j]);
                           k++;
                       }
                       if(k==n) break;
                   }
                    if(k!=n)
                    {
                        ff=1;
                    }
                   i=j;
                   while(!q1.empty())
                   {
                       int x=q1.front();
                       q1.pop();
                       if(!v[x])
                       {
                           v[x]=1;
     
                           if(f1==1)
                           {
                               s++;
                           }
                            q.push(x);
     
                       }
                   }
                   int pp=0;
                   int qq=q.size ();
                   if(ff==1&&f1!=1)
                   {
                       s+=qq-n;
                       break;
                   }
                   else
                   {
                       while(!q.empty())
                       {
                           int x=q.front();
                           q.pop();
                           pp++;
                           if(!v1[x])
                           {
                               v[x]=0;
                               s++;
                           }
                           else q.push(x);
                           if(pp==qq) break;
                       }
                   }
                }
     
            }
            cout<<s<<endl;
        }
        return 0;
    }
    View Code
    
    

    其实还有简单的方法:

    unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个),还有一个容易忽视的特性是它并不真正把重复的元素删除。他是c++中的函数,所以头文件要加#include<iostream.h>,具体用法如下:

        int num[100];

       unique(num,mun+n)返回的是num去重后的尾地址,之所以说比不真正把重复的元素删除,其实是,该函数把重复的元素一到后面去了,然后依然保存到了原数组中,然后返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。

    
    
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<math.h>
    #include<set>
    using namespace std;
    int n,m,q;
     
    int main()
    {
        while(cin>>n>>m>>q)
        {
            int a[50005];
            for(int i=0;i<q;i++)
            scanf("%d",&a[i]);
            sort(a,a+q);
            int x=unique(a,a+q)-a;
            printf("%d
    ",x);
        }
        return 0;
    }
    
    
    



  • 相关阅读:
    WSS3.0安装后,系统资源消耗这么大
    通过名称找到控件(VB.NET)
    zencart 对首页静态化处理
    zen cart 模板类 template_fun class
    现在网络上流行的病毒都太“厚道”了
    从SPS2003的邮件设置上看微软标准与国际标准
    我也有了BLOG,欢迎交流
    如何给WEBPART中增加客户端代码
    如何修改More Information 中的Page 2,Page 3,Page4
    汽车保养项目[转载]
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271052.html
Copyright © 2011-2022 走看看