從題意來看,是基本的SG函數應用,把剛學的set用進去優化,發現不行...
TLE...
再看看SG的原理,網上大部分都是採用遞歸,而那些題解報告都是一把抄,嗤之以鼻..
下面是直接TLE的代碼:
/*********************
S-Nim
Sevenster
2012.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-Nim
Sevenster
2012.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;
}