这个题目我错了很久,一直错的原因是我没有真正的理解题目的意思。
在 1 ABAB 这组数据上错了,改过来之后就过了,下一次一定要好好读题。
这一次是尽量用C++来写,在用rfind函数的时候出了一点小问题,应该是从这个字符往前推一位开始查找,若是第一个字符,就不能调用函数了,不然就会出错。所以就多加了一个判断,影响了程序的可读性。下一次要找到一个不需要这样判断的方法。
#include<iostream>
#include<string>
#define DEBUG 1
using namespace std ;

const int cap = 33 ;

char salon[cap] ;
string in ;

int check( int avai )


{
int i, j, pos(-1), flag, away(0) ;

for( i=0; i<in.size(); ++i )
{
if( i >= 1 )
pos = in.rfind( in[i], i ) ;

if( pos >= 0 )
{
flag = 0 ;

for( j=0; j<avai; ++j )
{

if( salon[j] == in[i] )
{
salon[j] = '\0' ;
flag = 1 ;
break ;
}
}

if( !flag )
{

for( j=0; j<avai; ++j )
{

if( !salon[j] )
{
flag = 1 ;
break ;
}
}
}
if( !flag )
++away ;
}

else
{

for( j=0; j<avai; ++j )
{

if( !salon[j] )
{
salon[j] = in[i] ;
break ;
}
}
}
}
return away ;
}

void output( int away )


{
if( away )
cout << away << " customer(s) walked away." << endl ;
else
cout << "All customers tanned successfully." << endl ;
}

int main( )


{
#if DEBUG
freopen("C:\\Documents and Settings\\Administrator\\桌面\\in.in","r",stdin) ;
freopen("C:\\Documents and Settings\\Administrator\\桌面\\out.out","w",stdout) ;
#endif

int avai, away ;

while( cin >> avai )
{
if( avai == 0 )
break ;
cin >> in ;
away = check( avai ) ;
output( away ) ;
}
return 0 ;
}
