從題意來看,是基本的SG函數應用,把剛學的set用進去最佳化,發現不行...
TLE...
再看看SG的原理,網上大部分都是採用遞迴,而那些題解報告都是一把抄,嗤之以鼻..
下面是直接TLE的代碼:
/*********************S-NimSevenster2012.08.26 12:55*********************/#include<iostream>#include<algorithm>#include<set>using namespace std;bool cmp( int a,int b ){ return a>b; }void setSG( int *sg,int *S,int Sn ){ //sort( S,S+Sn,cmp ); sg[0]=0; set<int> se; set<int>::iterator it; for( int i=1;i<=10000;i++ ) { se.erase(se.begin(),se.end()); for( int j=0;j<Sn;j++ ) { if( i-S[j]<0 ) continue; se.insert( sg[i-S[j]] ); } int fnum=0; while( true ) { if( se.find(fnum)==se.end() ) { sg[i]=fnum; break; } fnum++; } } return ;}int main(){ int S_size; int S[111];int sg[11111]; while( scanf("%d",&S_size)!=EOF&&S_size ) { for( int i=0;i<S_size;i++ ) scanf( "%d",&S[i] ); setSG( sg,S,S_size ); int T,n,data; scanf( "%d",&T ); while( T-- ) { int xo=0; scanf( "%d",&n ); for( int i=0;i<n;i++ ) { scanf( "%d",&data ); xo^=sg[data]; } printf( "%c",xo?'W':'L' ); } printf( "\n" ); } return 0;}
看來STL不能胡亂用=.=
悲催悲催...
/*********************S-NimSevenster2012.08.26 12:55*********************/#include<iostream>#include<algorithm>#include<set>using namespace std;bool cmp( int a,int b ){ return a>b; }void setSG( int *sg,int *S,int Sn ){ //sort( S,S+Sn,cmp ); sg[0]=0; //set<int> se; //set<int>::iterator it; bool flag[111]; for( int i=1;i<=10000;i++ ) { memset(flag,0,sizeof(flag)); for( int j=0;j<Sn;j++ ) { if( i-S[j]<0 ) continue; flag[sg[i-S[j]]]=1; } for( int j=0;j<=101;j++ ) if( flag[j]==0 ) { sg[i]=j; break; } } return ;}int main(){ int S_size; int S[111];int sg[11111]; while( scanf("%d",&S_size)!=EOF&&S_size ) { for( int i=0;i<S_size;i++ ) scanf( "%d",&S[i] ); setSG( sg,S,S_size ); int T,n,data; scanf( "%d",&T ); while( T-- ) { int xo=0; scanf( "%d",&n ); for( int i=0;i<n;i++ ) { scanf( "%d",&data ); xo^=sg[data]; } printf( "%c",xo?'W':'L' ); } printf( "\n" ); } return 0;}