uva 11111

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

#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 ; }

你可能感兴趣的:(struct,测试)