zoukankan      html  css  js  c++  java
  • HDU 4398 Template Library Management(贪心,STL)

    Template Library Management

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 298    Accepted Submission(s): 87


    Problem Description
    As an experienced ACMer, you must have known the importance of "code template library". With the help of pre-printed code library, you can implement the complicated algorithms correctly and efficiently. However, the size of the library is strictly limited during the contest. For example, you can only take at most 25 pages of printed codes in World Finals. So you must choose carefully which code template should be included.
    Now your team is participating a programming contest whose rules are slightly different from ICPC. This contest consists of N problems, and you must solved them in order: Before you solve the (i+1)th problem, you must solve the ith problem at first. And solving the ith problem requires a specified code template Ti.
    You are allowed to hold M code templates only. At the beginning of the contest, your are holding templates numbered 1, 2, ..., M. During the contest, if the problem you are trying to solve requires code template Ti, and Ti is happened at your hand (i.e, one of the M code templates you are holding is Ti), you can solve it immediately. On the other hand, if you are not holding Ti, you must call your friends who are outside the arena for help (yes, it is permitted, not cheating). They can give you the code template you need. Because you are only allowed to hold M code templates, after solving current problem, you must choose to drop the code you get from your friends just now, or to keep it and drop one of the M templates at your hand previously.
    Given the problem sequence in the contest and the limitation M, you want finish all the problems with minimum number of calling your friends.
     
    Input
    The first line of each test case contains two numbers N (1 <= N <= 100000) and M (1 <= M <= 100000). The second line contains N numbers T1, T2, ..., TN (1 <= Ti <= 109), indicating the code templates required by each problem.
     
    Output
    Output one line for each test case, indicating the minimum number of calling friends for help.
     
    Sample Input
    4 3 1 2 3 4 11 3 4 1 2 1 5 3 4 4 1 2 3
     
    Sample Output
    1 4
     
    Author
    RoBa
     
    Source
     
    Recommend
    zhuyuanchen520
     
     
     
     
    贪心。
    最优调度算法
    。如果要淘汰一个模板T,就要淘汰下一个T坐标最远的那个,如果不再出现就是无   穷远。
    这个程序用STL来实现,免去了离散化等操作,而且代码写起来比较简洁。
    看来要好好掌握STL,可以事半功倍。
    /*
    HDU 4398
    G++  156ms 2868K
    贪心,维护一个M个元素的集合,根据当前位置的元素的
    下一个位置选择,删除下一个位置最远的元素
    
    */
    
    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<set>
    using namespace std;
    const int MAXN=100010;
    
    int Ti[MAXN];
    int next[MAXN];
    map<int,int>mp;
    
    struct Node
    {
        int next_id;
        int ti;
    };
    struct classcomp
    {
        bool operator()(const Node &a,const Node &b)const
        {
            return a.next_id<b.next_id;//从小到大排序
        }
    };//这个逗号别忘记
    multiset<Node,classcomp>T_info;
    multiset<Node>::iterator it_n;
    set<int>Te;
    set<int>::iterator it;
    
    int main()
    {
       // freopen("in.txt","r",stdin);
       // freopen("out.txt","w",stdout);
        int n,m;
        while(scanf("%d%d",&n,&m)==2)
        {
            for(int i=1;i<=n;i++)
              scanf("%d",&Ti[i]);
            mp.clear();//清空map
            for(int i=n;i>=1;i--)//从后往前扫描
            {
                if(mp[Ti[i]])//出现过
                   next[i]=mp[Ti[i]];
                else next[i]=n+1;\
                mp[Ti[i]]=i;
            }
            Te.clear();
            T_info.clear();
            for(int i=1;i<=m;i++)//先把前面带的m个模板入set
            {
                if(!mp[i])mp[i]=n+1;
                Node temp;
                temp.next_id=mp[i];
                temp.ti=i;
                T_info.insert(temp);
                Te.insert(i);
            }
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                it=Te.find(Ti[i]);
                if(it!=Te.end())
                {
                    Node temp;
                    temp.next_id=i;
                    temp.ti=Ti[i];
                    T_info.erase(temp);
                    temp.next_id=next[i];//更新
                    T_info.insert(temp);
                }
                else
                {
                    ans++;
                    it_n=T_info.end();
                    it_n--;
                    if(next[i]<(*it_n).next_id)
                    {
                        Te.erase((*it_n).ti);
                        T_info.erase(it_n);
                        Te.insert(Ti[i]);
                        Node temp;
                        temp.next_id=next[i];
                        temp.ti=Ti[i];
                        T_info.insert(temp);
                    }
                }
            }
            printf("%d\n",ans);
    
        }
        return 0;
    }
  • 相关阅读:
    详解如何在vue项目中引入饿了么elementUI组件
    移动端Web页面适配方案
    蛋糕仙人的javascript笔记
    小程序框架细节系列
    微信小程序 获取用户信息并保存登录状态
    (尚006)Vue计算属性之set与get
    (尚004)Vue计算属性之基本使用和监视
    (尚003).Vue_模板语法
    (尚002)Vue的基本使用
    (尚001)Vue框架介绍
  • 原文地址:https://www.cnblogs.com/kuangbin/p/2659036.html
Copyright © 2011-2022 走看看