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 }