poj 1250 Tanning Salon
這題不用完全模擬不好做,我放棄用邏輯分析的方法。。
題意:一個旅館有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");
else
printf("%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;
}
else
bedCount++;
}
}
if(leaveNum==0)
printf("All customers tanned successfully.\n");
else
printf("%d\n",leaveNum);
}
return 0;
}
最後更新:2017-04-03 14:53:55