丝毫没有感觉到用到数据结构,可能是太水了
题意:酒店里有10个房间和两个门(左边和右边),进门后先安排最近的房间,客人可以随时离开房间。给定一个长度为n的字符串,L表示客人从左边的门进入,R表示客人从右边的门进入,0~9表示该房间的客人离开房间。求最后房间的状态。
思路:直接模拟即可。对于每一个L或R,分别从开始或结尾遍历到第一个为没有人的房间;对于数字,直接让该a[i]=0即可。
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; int a[maxn],n; int main(){ cin>>n; string s;cin>>s; for(int i=0;i<s.size();i++){ if(s[i]=='L'){ for(int j=0;j<10;j++) if(!a[j]){ a[j]=1; break; } } else if(s[i]=='R'){ for(int j=9;j>=0;j--) if(!a[j]){ a[j]=1; break; } } else a[s[i]-'0']=0; } for(int i=0;i<10;i++) cout<<a[i]; return 0; }
题意:给定一个长度为n的数组,要求第i天的最低需求为i,问用这个数组里的数最多能够满足多少天的需求。
思路:贪心的思想,a[i]小的先用,记录一下就可以了
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; int a[maxn],n; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int res=1; sort(a+1,a+1+n); for(int i=1;i<=n;i++) if(a[i]>=res) res++; cout<<res-1; return 0; }
题意:给定一个数组,每一组询问都求x~n中不同的数的个数。
思路:直接暴力肯定超时,我们可以维护一个后缀s[i]表示从i~n不同的数的个数,这样就可以O(1)查询了。总的时间复杂度是O(n+m);
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; int a[maxn],s[maxn],q[maxn]; int n,m; int main(){ cin>>n>>m; s[n+1]=0; set<int>ss; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=n;i;i--) if(ss.count(a[i])==0){ ss.insert(a[i]); s[i]=s[i+1]+1; } else s[i]=s[i+1]; for(int i=1;i<=m;i++){ cin>>q[i]; cout<<s[q[i]]<<endl; } return 0; }