丝毫没有感觉到用到数据结构,可能是太水了
题意:酒店里有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;
} 
京公网安备 11010502036488号