【贪心】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\n",ans);
77     }
78     return 0;
79 }
View Code

 

posted @ 2017-05-29 19:19  shulin15  阅读(213)  评论(0编辑  收藏  举报