您的位置:首页 > 其它

uva 11111

2010-08-02 08:41 357 查看
这个题可以把一对正负数看成一个括号,都说这么明显了,其他的就不用说了吧.........呵呵,需要注意的是在字符串里把数字给分离出来的方法( 两个数字中间有多个空格的情况在测试数据中有可能出现 ) ,而且也有可能有空行..........

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std ;

const int maxn = 100000 + 10 ;

struct Toy { int size ; int remain ; } ;

struct myStack { Toy toy[maxn] ; int top ; } Stack ;

void init()
{
for( int i = 0 ; i < maxn ; i++ )
{
Stack.toy[Stack.top].size = 0 ;//栈顶玩具大小初始为0
Stack.toy[Stack.top].remain = 0 ;//栈顶玩具剩余体积初始化为0
}
Stack.top = 0 ;
return ;
}

int main()
{
char str[maxn] ;
memset( str , 0 , sizeof( str ) ) ;
while( gets( str ) )
{
init() ;
int len = strlen( str ) ;
int arr[maxn] ;
memset( arr , 0 , sizeof( arr ) ) ;
int count = 0 ;
for( int i = 0 ; i < len ; )
{
arr[count++] = ( int ) atof( str + i ) ;
do i++ ;
while( !( str[i] == ' ' && ( str[i+1] == '-' || isdigit( str[i+1] ) ) ) ) ;//将数字分离出来
}
int i ;
int flag = 0 ;
for( i = count - 1 ; i >= 0 ; i-- )
{
if( arr[i] > 0 )
{
flag = 1 ;
Stack.top++ ;
Stack.toy[Stack.top].size = arr[i] ;
Stack.toy[Stack.top].remain = arr[i] ;
if( Stack.top - 1 )
{
Stack.toy[Stack.top - 1].remain -= Stack.toy[Stack.top].size ;
if( Stack.toy[Stack.top - 1].remain <= 0 )//如果剩余体积小于等于零,装不下,退出
break ;
}
}
else
if( arr[i] < 0 )
{
int a = arr[i] ;
int b = Stack.toy[Stack.top].size ;
if( a + b == 0 ) Stack.top-- ;
else break ;//如果两数相加不等零,说明不是一个玩具,也就是说装乱套了
}
}
if( ! flag ) cout << ":-( Try again." << endl ;//只有栈进入过元素才有可能输出Matrioshka
else if( flag  && Stack.top )
cout << ":-( Try again." << endl ;
else cout << ":-) Matrioshka!" << endl ;
memset( str , 0 , sizeof( str ) ) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: