Namareba食べたい

備忘録てきなもの。だらだら書いていきます。

2012 ICPC国内予選B問題 

B問題

これも実装ゲー

でもやはりまだstr,char配列からintの扱いが苦手かも

 

#include<iostream>

#include<map>

#include<algorithm>

#include<cstdlib>

#include<cmath>

#include<cstring>

using namespace std;

typedef pair<bool,int> P; // i,j

int main(){

   int L,ans;

   int ii=1;

   string An;

   char change[1000000];

   string a0;

   map<int,P> Index;

   int val[20],maxval[20],minval[20];

   while(true){

      cin >> a0 >> L;

      if(a0 == "0" && L == 0)break;

      Index.clear();

      ii=1;

      for(int i=0;i<L;i++){

if(a0.length() > i){

val[i] = a0[i]-'0';

}

else val[i] = 0;

      }

 

      for(int i=0;i<L;i++){

maxval[i]=minval[i]=val[i];

      }

      int A0 = atoi(a0.substr(0,a0.length()).c_str());

      Index[A0] = P(true,0);    

      while(true){

 

 

 

 

sort(maxval,maxval+L,greater<int>());

sort(minval,minval+L);

 

int A=0,B=0; // A = min . B = max

int ind=L-1;

for(int i=0;i<L;i++){ 

   A += maxval[i]*pow((double)10,i);

   B += minval[i]*pow((double)10,i);

}

int IND = B-A;

 

if(!Index[IND].first){

Index[IND] = P(true,ii);

}

else {

   cout << Index[IND].second << " " << IND << " " << ii - Index[IND]

.second << endl;

   break;

ii++;

 

sprintf(change,"%d",IND);

An.clear();

An.append(change);

for(int i=0;i<L;i++){

   if(An.length() > i){

      val[i] = An[i]-'0';

   }

   else val[i] = 0;

}

 

for(int i=0;i<L;i++){

   maxval[i]=minval[i]=val[i];

}

 

 

      }

 

 

 

   }

   return 0;

}