GCJ round1B 2009

GCJ round1B 2009
很久没写了,最近做了一下,感觉代码能力更糟了。
#include < set >
#include
< map >
#include
< vector >
#include
< string >
#include
< algorithm >
#include
< iostream >
#include
< queue >
using   namespace  std;
vector
< int > num;
vector
< int > res;
int  min_digit( int  pos, int  len)
{
    
int  smin = INT_MAX;
    
int  k =- 1 ;
    
for ( int  i = pos;i < len;i ++ )
    {
        
if (num[i] != 0   &&  num[i] < smin)
        {
            k
= i;
            smin
= num[i];
        }
    }
    
return  k;
}
int  min_digit_bigger( int  pos, int  len)
{
    
int  smin = INT_MAX;
    
int  k =- 1 ;
    
for ( int  i = pos;i < len;i ++ )
    {
        
if (num[i] < smin  &&  num[i] > num[pos - 1 ])
        {
            k
= i;
            smin
= num[i];
        }
    }
    
return  k;
}
void  solve()
{
    
int  len = num.size();
    
int  pos;
    
for (pos = len - 1 ;pos > 0   &&  num[pos] <= num[pos - 1 ];pos -- );
    
if (pos == 0 )
    {
        
int  min_pos = min_digit(pos,len);
        
if (min_pos ==- 1
        {
            res.push_back(num[
0 ]);
        }
        
else  
        {
            res.push_back(num[min_pos]);
            num[min_pos]
= 0 ;
        }
        res.push_back(
0 );
        sort(num.begin(),num.end());
        
for ( int  i = 1 ;i < len;i ++ )
            res.push_back(num[i]);
    }
    
else
    {
        
for ( int  i = 0 ;i < pos - 1 ;i ++ )
            res.push_back(num[i]);
        
int  min_pos_bigger = min_digit_bigger(pos,len);
        res.push_back(num[min_pos_bigger]);
        num[min_pos_bigger]
= 0 ;
        
        vector
< int > tmp;
        
for ( int  i = pos - 1 ;i < len;i ++ )
            tmp.push_back(num[i]);
        sort(tmp.begin(),tmp.end());
        
for ( int  i = 1 ;i < tmp.size();i ++ )
            res.push_back(tmp[i]);
    }
}

int  main()
{
    freopen(
" in " , " r " ,stdin);
    freopen(
" out.txt " , " w " ,stdout);
    
    
char  ch;
    
int  caseNum;
    cin
>> caseNum;
    getchar();

    
for ( int  caseId = 1 ;caseId <= caseNum;caseId ++ )
    {
        num.clear();
        res.clear();
        
while ((ch = getchar()) != ' \n ' )
        {
            num.push_back(ch
- ' 0 ' );
        }
        solve();
        cout
<< " Case # " << caseId << " " ;
        
for ( int  i = 0 ;i < res.size();i ++ )
            cout
<< res[i];
        cout
<< endl;
    }
}

写完之后看了ACRush的代码。刚开始没看懂,以为他随便提交了一个程序,因为他只用了next_permutation.后来才领悟。原来next_permutation会自动生成下一个逻辑较大的排列。发下他的代码膜拜下
#include  < vector >
#include 
< list >
#include 
< map >
#include 
< set >
#include 
< deque >
#include 
< queue >
#include 
< stack >
#include 
< bitset >
#include 
< algorithm >
#include 
< functional >
#include 
< numeric >
#include 
< utility >
#include 
< sstream >
#include 
< iostream >
#include 
< iomanip >
#include 
< cstdio >
#include 
< cmath >
#include 
< cstdlib >
#include 
< cctype >
#include 
< string >
#include 
< cstring >
#include 
< cstdio >
#include 
< cmath >
#include 
< cstdlib >
#include 
< ctime >

using   namespace  std;

// BEGINTEMPLATE_BY_ACRUSH_TOPCODER
#define  SIZE(X) ((int)(X.size())) // NOTES:SIZE(
#define  LENGTH(X) ((int)(X.length())) // NOTES:LENGTH(
#define  MP(X,Y) make_pair(X,Y) // NOTES:MP(
typedef 
long   long  int64; // NOTES:int64
typedef unsigned  long   long  uint64; // NOTES:uint64
#define  two(X) (1<<(X)) // NOTES:two(
#define  twoL(X) (((int64)(1))<<(X)) // NOTES:twoL(
#define  contain(S,X) (((S)&two(X))!=0) // NOTES:contain(
#define  containL(S,X) (((S)&twoL(X))!=0) // NOTES:containL(
const   double  pi = acos( - 1.0 ); // NOTES:pi
const   double  eps = 1e - 11 ; // NOTES:eps
template < class  T >  inline  void  checkmin(T  & a,T b){ if (b < a) a = b;} // NOTES:checkmin(
template < class  T >  inline  void  checkmax(T  & a,T b){ if (b > a) a = b;} // NOTES:checkmax(
template < class  T >  inline T sqr(T x){ return  x * x;} // NOTES:sqr
typedef pair < int , int >  ipair; // NOTES:ipair
template < class  T >  inline T lowbit(T n){ return  (n ^ (n - 1 )) & n;} // NOTES:lowbit(
template < class  T >  inline  int  countbit(T n){ return  (n == 0 ) ? 0 :( 1 + countbit(n & (n - 1 )));} // NOTES:countbit(
// Numberic Functions
template < class  T >  inline T gcd(T a,T b) // NOTES:gcd(
  { if (a < 0 ) return  gcd( - a,b); if (b < 0 ) return  gcd(a, - b); return  (b == 0 ) ? a:gcd(b,a % b);}
template
< class  T >  inline T lcm(T a,T b) // NOTES:lcm(
  { if (a < 0 ) return  lcm( - a,b); if (b < 0 ) return  lcm(a, - b); return  a * (b / gcd(a,b));}
template
< class  T >  inline T euclide(T a,T b,T  & x,T  & y) // NOTES:euclide(
  { if (a < 0 ){T d = euclide( - a,b,x,y);x =- x; return  d;}
   
if (b < 0 ){T d = euclide(a, - b,x,y);y =- y; return  d;}
   
if (b == 0 ){x = 1 ;y = 0 ; return  a;} else {T d = euclide(b,a % b,x,y);T t = x;x = y;y = t - (a / b) * y; return  d;}}
template
< class  T >  inline vector < pair < T, int >   >  factorize(T n) // NOTES:factorize(
  {vector < pair < T, int >   >  R; for  (T i = 2 ;n > 1 ;){ if  (n % i == 0 ){ int  C = 0 ; for  (;n % i == 0 ;C ++ ,n /= i);R.push_back(make_pair(i,C));}
   i
++ ; if  (i > n / i) i = n;} if  (n > 1 ) R.push_back(make_pair(n, 1 )); return  R;}
template
< class  T >  inline  bool  isPrimeNumber(T n) // NOTES:isPrimeNumber(
  { if (n <= 1 ) return   false ; for  (T i = 2 ;i * i <= n;i ++ if  (n % i == 0 return   false ; return   true ;}
template
< class  T >  inline T eularFunction(T n) // NOTES:eularFunction(
  {vector < pair < T, int >   >  R = factorize(n);T r = n; for  ( int  i = 0 ;i < R.size();i ++ )r = r / R[i].first * (R[i].first - 1 ); return  r;}
// Matrix Operations
const   int  MaxMatrixSize = 40 ; // NOTES:MaxMatrixSize
template < class  T >  inline  void  showMatrix( int  n,T A[MaxMatrixSize][MaxMatrixSize]) // NOTES:showMatrix(
  { for  ( int  i = 0 ;i < n;i ++ ){ for  ( int  j = 0 ;j < n;j ++ )cout << A[i][j];cout << endl;}}
template
< class  T >  inline T checkMod(T n,T m) { return  (n % m + m) % m;} // NOTES:checkMod(
template < class  T >  inline  void  identityMatrix( int  n,T A[MaxMatrixSize][MaxMatrixSize]) // NOTES:identityMatrix(
  { for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) A[i][j] = (i == j) ? 1 : 0 ;}
template
< class  T >  inline  void  addMatrix( int  n,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize]) // NOTES:addMatrix(
  { for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) C[i][j] = A[i][j] + B[i][j];}
template
< class  T >  inline  void  subMatrix( int  n,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize]) // NOTES:subMatrix(
  { for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) C[i][j] = A[i][j] - B[i][j];}
template
< class  T >  inline  void  mulMatrix( int  n,T C[MaxMatrixSize][MaxMatrixSize],T _A[MaxMatrixSize][MaxMatrixSize],T _B[MaxMatrixSize][MaxMatrixSize]) // NOTES:mulMatrix(
  { T A[MaxMatrixSize][MaxMatrixSize],B[MaxMatrixSize][MaxMatrixSize];
  
for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) A[i][j] = _A[i][j],B[i][j] = _B[i][j],C[i][j] = 0 ;
  
for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ for  ( int  k = 0 ;k < n;k ++ ) C[i][j] += A[i][k] * B[k][j];}
template
< class  T >  inline  void  addModMatrix( int  n,T m,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize]) // NOTES:addModMatrix(
  { for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) C[i][j] = checkMod(A[i][j] + B[i][j],m);}
template
< class  T >  inline  void  subModMatrix( int  n,T m,T C[MaxMatrixSize][MaxMatrixSize],T A[MaxMatrixSize][MaxMatrixSize],T B[MaxMatrixSize][MaxMatrixSize]) // NOTES:subModMatrix(
  { for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) C[i][j] = checkMod(A[i][j] - B[i][j],m);}
template
< class  T >  inline T multiplyMod(T a,T b,T m) { return  (T)((((int64)(a) * (int64)(b) % (int64)(m)) + (int64)(m)) % (int64)(m));} // NOTES:multiplyMod(
template < class  T >  inline  void  mulModMatrix( int  n,T m,T C[MaxMatrixSize][MaxMatrixSize],T _A[MaxMatrixSize][MaxMatrixSize],T _B[MaxMatrixSize][MaxMatrixSize]) // NOTES:mulModMatrix(
  { T A[MaxMatrixSize][MaxMatrixSize],B[MaxMatrixSize][MaxMatrixSize];
  
for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ ) A[i][j] = _A[i][j],B[i][j] = _B[i][j],C[i][j] = 0 ;
  
for  ( int  i = 0 ;i < n;i ++ for  ( int  j = 0 ;j < n;j ++ for  ( int  k = 0 ;k < n;k ++ ) C[i][j] = (C[i][j] + multiplyMod(A[i][k],B[k][j],m)) % m;}
template
< class  T >  inline T powerMod(T p, int  e,T m) // NOTES:powerMod(
  { if (e == 0 ) return   1 % m; else   if (e % 2 == 0 ){T t = powerMod(p,e / 2 ,m); return  multiplyMod(t,t,m);} else   return  multiplyMod(powerMod(p,e - 1 ,m),p,m);}
// Point&Line
double  dist( double  x1, double  y1, double  x2, double  y2){ return  sqrt(sqr(x1 - x2) + sqr(y1 - y2));} // NOTES:dist(
double  distR( double  x1, double  y1, double  x2, double  y2){ return  sqr(x1 - x2) + sqr(y1 - y2);} // NOTES:distR(
template < class  T >  T cross(T x0,T y0,T x1,T y1,T x2,T y2){ return  (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);} // NOTES:cross(
int  crossOper( double  x0, double  y0, double  x1, double  y1, double  x2, double  y2) // NOTES:crossOper(
  { double  t = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0); if  (fabs(t) <= eps)  return   0 ; return  (t < 0 ) ?- 1 : 1 ;}
bool  isIntersect( double  x1, double  y1, double  x2, double  y2, double  x3, double  y3, double  x4, double  y4) // NOTES:isIntersect(
  { return  crossOper(x1,y1,x2,y2,x3,y3) * crossOper(x1,y1,x2,y2,x4,y4) < 0   &&  crossOper(x3,y3,x4,y4,x1,y1) * crossOper(x3,y3,x4,y4,x2,y2) < 0 ;}
bool  isMiddle( double  s, double  m, double  t){ return  fabs(s - m) <= eps  ||  fabs(t - m) <= eps  ||  (s < m) != (t < m);} // NOTES:isMiddle(
// Translator
bool  isUpperCase( char  c){ return  c >= ' A '   &&  c <= ' Z ' ;} // NOTES:isUpperCase(
bool  isLowerCase( char  c){ return  c >= ' a '   &&  c <= ' z ' ;} // NOTES:isLowerCase(
bool  isLetter( char  c){ return  c >= ' A '   &&  c <= ' Z '   ||  c >= ' a '   &&  c <= ' z ' ;} // NOTES:isLetter(
bool  isDigit( char  c){ return  c >= ' 0 '   &&  c <= ' 9 ' ;} // NOTES:isDigit(
char  toLowerCase( char  c){ return  (isUpperCase(c)) ? (c + 32 ):c;} // NOTES:toLowerCase(
char  toUpperCase( char  c){ return  (isLowerCase(c)) ? (c - 32 ):c;} // NOTES:toUpperCase(
template < class  T >   string  toString(T n){ostringstream ost;ost << n;ost.flush(); return  ost.str();} // NOTES:toString(
int  toInt( string  s){ int  r = 0 ;istringstream sin(s);sin >> r; return  r;} // NOTES:toInt(
int64 toInt64( string  s){int64 r = 0 ;istringstream sin(s);sin >> r; return  r;} // NOTES:toInt64(
double  toDouble( string  s){ double  r = 0 ;istringstream sin(s);sin >> r; return  r;} // NOTES:toDouble(
template < class  T >   void  stoa( string  s, int   & n,T A[]){n = 0 ;istringstream sin(s); for (T v;sin >> v;A[n ++ ] = v);} // NOTES:stoa(
template < class  T >   void  atos( int  n,T A[], string   & s){ostringstream sout; for ( int  i = 0 ;i < n;i ++ ){ if (i > 0 )sout << '   ' ;sout << A[i];}s = sout.str();} // NOTES:atos(
template < class  T >   void  atov( int  n,T A[],vector < T >   & vi){vi.clear(); for  ( int  i = 0 ;i < n;i ++ ) vi.push_back(A[i]);} // NOTES:atov(
template < class  T >   void  vtoa(vector < T >  vi, int   & n,T A[]){n = vi.size(); for  ( int  i = 0 ;i < n;i ++ )A[i] = vi[i];} // NOTES:vtoa(
template < class  T >   void  stov( string  s,vector < T >   & vi){vi.clear();istringstream sin(s); for (T v;sin >> v;vi.push_bakc(v));} // NOTES:stov(
template < class  T >   void  vtos(vector < T >  vi, string   & s){ostringstream sout; for  ( int  i = 0 ;i < vi.size();i ++ ){ if (i > 0 )sout << '   ' ;sout << vi[i];}s = sout.str();} // NOTES:vtos(
// Fraction
template < class  T >   struct  Fraction{T a,b;Fraction(T a = 0 ,T b = 1 ); string  toString();}; // NOTES:Fraction
  template < class  T >  Fraction < T > ::Fraction(T a,T b){T d = gcd(a,b);a /= d;b /= d; if  (b < 0 ) a =- a,b =- b; this -> a = a; this -> b = b;}
  template
< class  T >   string  Fraction < T > ::toString(){ostringstream sout;sout << a << " / " << b; return  sout.str();}
  template
< class  T >  Fraction < T >   operator + (Fraction < T >  p,Fraction < T >  q){ return  Fraction < T > (p.a * q.b + q.a * p.b,p.b * q.b);}
  template
< class  T >  Fraction < T >   operator - (Fraction < T >  p,Fraction < T >  q){ return  Fraction < T > (p.a * q.b - q.a * p.b,p.b * q.b);}
  template
< class  T >  Fraction < T >   operator * (Fraction < T >  p,Fraction < T >  q){ return  Fraction < T > (p.a * q.a,p.b * q.b);}
  template
< class  T >  Fraction < T >   operator / (Fraction < T >  p,Fraction < T >  q){ return  Fraction < T > (p.a * q.b,p.b * q.a);}
// ENDTEMPLATE_BY_ACRUSH_TOPCODER

const   int  maxn = 20 + 5 ;

int  n;
int  A[maxn];

int  main()
{
//     freopen("B.in","r",stdin);
//     freopen("B-small-attempt0.in","r",stdin);freopen("B-small-attempt0.out","w",stdout);
//     freopen("B-small-attempt1.in","r",stdin);freopen("B-small-attempt1.out","w",stdout);
    freopen( " B-large.in " , " r " ,stdin);freopen( " B-large.out " , " w " ,stdout);
    
int  testcase;
    scanf(
" %d " , & testcase);
    
for  ( int  caseId = 1 ;caseId <= testcase;caseId ++ )
    {
        
char  str[ 100 ];
        scanf(
" %s " ,str);
        n
= 0 ;
        
for  ( int  i = 0 ;str[i];i ++ ) A[n ++ ] = str[i] - ' 0 ' ;
        
if  (next_permutation(A,A + n) == 0 )
        {
            n
= 0 ;
            A[n
++ ] = 0 ;
            
for  ( int  i = 0 ;str[i];i ++ ) A[n ++ ] = str[i] - ' 0 ' ;
            next_permutation(A,A
+ n);
        }
        printf(
" Case #%d:  " ,caseId);
        
for  ( int  i = 0 ;i < n;i ++ )
            printf(
" %d " ,A[i]);
        printf(
" \n " );
    }
    
return   0 ;
}


你可能感兴趣的:(GCJ round1B 2009)