西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数) 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\n",x);
    }
    return 0;
}
 
       
      



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

    int num[100];

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

猜你喜欢

转载自www.cnblogs.com/caiyishuai/p/8903956.html