这个题目我错了很久,一直错的原因是我没有真正的理解题目的意思。
在 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 ;
}