当前位置: 代码迷 >> 综合 >> poj 1250 Tanning Salon
  详细解决方案

poj 1250 Tanning Salon

热度:0   发布时间:2024-01-11 17:03:25.0

这题不用完全模拟不好做,我放弃用逻辑分析的方法。。

题意:一个旅馆有n个位,给出所有旅客到达旅馆和离开旅馆的顺序,问有多少旅客是没有住旅馆就离开的。
 
思路:基础模拟题。这句“Customers who leave without tanning always depart before customers who are currently tanning”要注意下,其实就是如果顾客i来的时候没有空位了,无论他什么时候离开,都是算做没有住旅馆。


其实我第一眼看这题的时候觉得应该用一个栈(广义栈),因为可以从任何位置离开。。后来发现这样想多了

其实这道题我开始并没有直接用一个Flag字符数组模拟床位,而是分析床位的count这样就有很多麻烦【见下面错误的代码】,比如一个顾客来了没有床位,但是他没有马上离开。。。又来了一个。。。


后来用完全模拟就直接过了。。。

AC的代码:

#include <stdio.h>
#include <string.h>int main()
{int n;char Customers[100];char bedFlag[25];while(scanf("%d",&n))	//n 代表床位数量{//输入数据if(n==0)return 0;scanf("%s",Customers);memset(bedFlag,'#',sizeof(bedFlag));	//'#' 代表空位//处理开始int i,j,k;int leaveNum=0;for(i=0;i<strlen(Customers);i++){//找床位,看在不在床位里for(j=0;j<n;j++){if(Customers[i]==bedFlag[j]){bedFlag[j]='#';	//收回床位break;}}if(j<n)	//用完了离开的continue;else	//不在床位中的{//看能找到空位吗for(k=0;k<n;k++){if(bedFlag[k]=='#'){bedFlag[k]=Customers[i];break;}}if(k<n)	//找到空位continue;else{leaveNum++;continue;}}}if(leaveNum==0)printf("All customers tanned successfully.\n");elseprintf("%d customer(s) walked away.\n",leaveNum/2);}return 0;
}



错误的分析代码:

#include <stdio.h>
#include <string.h>int main()
{int n;char Customers[100];while(scanf("%d",&n))	//n 代表床位数量{//输入数据if(n==0)return 0;scanf("%s",Customers);//处理开始int i,j;int leaveNum=0;int bedCount=0;	//计数床数是否到达最大数量for(i=0;i<strlen(Customers);i++){//看之前出现过吗,出现过就代表leave,没有出现过就入床位for(j=0;j<i;j++){if(Customers[i]==Customers[j])	//以前出现过,代表离开,因为No letter will occur in more than one pair. {bedCount--;break;}}if(j<i)		//用完床位,离开continue;else if(j==i)		//新入来访{//看当前床位满了吗,满了就必须离开if(bedCount==n){leaveNum++;i++;continue;}elsebedCount++;}}if(leaveNum==0)printf("All customers tanned successfully.\n");elseprintf("%d\n",leaveNum);}return 0;
}