Description
一个旅馆有n个位,给出所有旅客到达旅馆和离开旅馆的顺序,问有多少旅客是没有住旅馆就离开的
Input
多组用例,每组用例首先输入旅馆的床位数n(n<=20),然后是旅客到达旅馆的顺序,每个大写字母代表一位旅客,以n=0结束输入
Output
对于每组用例,输出没有住旅馆就离开的旅客人数,若是所有旅客均住旅馆则输出All customers tanned successfully.
Sample Input
2 ABBAJJKZKZ
3 GACCBDDBAGEE
3 GACCBGDDBAEE
1 ABCBCA
0
Sample Output
All customers tanned successfully.
1 customer(s) walked away.
All customers tanned successfully.
2 customer(s) walked away.
Solution
简单模拟题
因为旅客用大写字母代替,所以人数很少,故可以用一个整型数组c[30]储每位旅客到达旅馆情况,0表示未来过,1表示入住,2表示到达旅馆但无床位。同样的,因旅馆床位也很少,故可以用一个字符数组z[30]存储床位使用情况,例如:z[i]=’A’表示旅客A入住i房,这样就可以根据每位旅客到达旅馆情况更新旅馆床位使用请况,那么未能入住的乘客人数即可轻易得知
Code
#include<stdio.h>
#include<string.h>
int main()
{
int n,zz,i,j,k,r,len,c[30]={0};//c[30]存储每位旅客到达旅馆情况,0表示未来过,1表示入住,2表示到达旅馆但无床位
char s[100],z[30];//s[100]表示旅客到达旅馆次序,z[30]表示旅馆床位使用情况
scanf("%d",&n);
while(n!=0)
{
r=zz=0;
gets(s);
len=strlen(s);
for(i=0;i<len;i++)
{
if(c[s[i]-'A']==0)//该乘客第一次来
{
c[s[i]-'A']=1;//更新到达旅馆情况
if(zz<n)//有床位则该乘客入住
z[zz++]=s[i];
else//无床位则
{
c[s[i]-'A']=2;//更新到达旅馆情况
r++;//未入住旅客人数
}
}
else if(c[s[i]-'A']==1)//来过并入住的旅客离开
{
zz--;//入住人数减一
c[s[i]-'A']=0;//更新到达旅馆情况
}
else if(c[s[i]-'A']==2)//来过一次未入住的旅客离开
c[s[i]-'A']=0;//更新到达旅馆情况
}
if(r==0)//所有旅客均入住
printf("All customers tanned successfully.\n");
else//存在未入住旅客
printf("%d customer(s) walked away.\n",r);
scanf("%d",&n);
}
}