zoukankan      html  css  js  c++  java
  • 【贪心】codeforces A. Heidi and Library (easy)

    http://codeforces.com/contest/802/problem/A

    【题意】

    有一个图书馆,刚开始没有书,最多可容纳k本书;有n天,每天会有人借一本书,当天归还;如果图书馆有这个本就直接借到,否则图书馆的人会购买这本书,每本书的价格都是1;如果现在图书馆的书已达上限还需购买,必须舍弃已有的一本书,以后再有人借这本书要重新购买。

    问图书馆的人最少要花多少钱购书?

    【思路】

    关键是替换原则,每次都替换下一次出现最晚的,因为它占用图书馆的时间最长。不是替换后面需要数量最少的!比如

    10 2

    1 2 4 5 1 1 1 1 2 3

    4是替换2而不是1

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<vector>
     7 #include<algorithm> 
     8 
     9 using namespace std;
    10 typedef long long ll;
    11 const int maxn=82;
    12 const int inf=0x3f3f3f3f;
    13 int n,m;
    14 int vis[maxn];
    15 int num[maxn];
    16 int nxt[maxn];
    17 int a[maxn];
    18 int main()
    19 {
    20     while(~scanf("%d%d",&n,&m))
    21     {
    22         memset(vis,0,sizeof(vis));
    23         memset(num,0,sizeof(num));
    24         memset(nxt,0,sizeof(nxt));
    25         for(int i=0;i<n;i++)
    26         {
    27             scanf("%d",&a[i]);    
    28             num[a[i]]++;
    29         }
    30         int ans=0;
    31         int cnt=0;
    32         for(int i=0;i<n;i++)
    33         {
    34             num[a[i]]--;
    35             if(!vis[a[i]])
    36             {
    37                 ans++;
    38                 if(cnt<m)
    39                 {
    40                     cnt++;
    41                 }
    42                 else
    43                 {
    44                     int index=0;
    45                     //替换
    46                     for(int k=0;k<i;k++)
    47                     {
    48                         if(vis[a[k]])
    49                         {
    50                             //如果有一个以后都不出现 
    51                             if(num[a[k]]==0)
    52                             {
    53                                 index=a[k];                
    54                                 break;
    55                             }
    56                         }
    57                     }
    58                     if(index==0)
    59                     {
    60                         memset(nxt,0,sizeof(nxt));
    61                         int mmax=-inf;
    62                         for(int k=i+1;k<n;k++)
    63                         {
    64                             if(vis[a[k]]&&!nxt[a[k]])
    65                             {
    66                                 index=a[k];
    67                                 nxt[a[k]]=1;
    68                             }
    69                         }
    70                     }
    71                     vis[index]=0; 
    72                 }
    73                 vis[a[i]]=1;
    74             }
    75         }
    76         printf("%d
    ",ans);
    77     }
    78     return 0;
    79 }
    View Code
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/itcsl/p/6918801.html
Copyright © 2011-2022 走看看