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
  • 相关阅读:
    PAT Basic 1023 组个最小数 (20 分)
    PAT Advanced 1048 Find Coins (25 分)
    PAT Basic 1005 继续(3n+1)猜想 (25 分)
    PAT Advanced 1050 String Subtraction (20 分)
    PAT Advanced 1041 Be Unique (20 分)
    PAT Basic 1047 编程团体赛 (20 分)
    SpringSecurity整合SpringBoot
    给正在运行的Docker容器动态绑定卷组
    linux 中格式化json字符串
    docker/kubernetes国内源/镜像源解决方式
  • 原文地址:https://www.cnblogs.com/itcsl/p/6918801.html
Copyright © 2011-2022 走看看