2012年2月8日水曜日

今日のPractice

SRM 200 Div2
Easy(250)
入力された数式を左から順に計算するだけ。
こんな問題で実装に13分掛かるのもどうなのよ…

#include<string>
#include<cstdio>
using namespace std;

class NoOrderOfOperations{
public:
 int evaluate(string expr){
  int i,l,ans,n;
  char buf[] = {"0"};
  l = expr.length();
  buf[0] = expr[0];
  sscanf(buf,"%d",&ans);
  for(i = 1; i < l; i += 2){
   buf[0] = expr[i + 1];
   sscanf(buf,"%d",&n);
   buf[0] = expr[i];
   if(buf[0] == '+')
    ans = ans + n;
   if(buf[0] == '-')
    ans = ans - n;
   if(buf[0] == '*')
    ans = ans * n;
  }
  return ans;
 }
};
192.29 points.
アルゴリズムもなにも無い単純なプログラムなんだけど、しばらく文字列を扱って無いのでどうやって文字から数字に変換すればいいのか大分悩んだ。
たった今満点の解答見たけど、文字から'0'引けばいいだけじゃん…なんで思いつかなかったのか。
#include<string>
#include<cstdio>
using namespace std;

class NoOrderOfOperations{
public:
 int evaluate(string expr){
  int i,l,ans,n;
  
  l = expr.length();
  ans = expr[0] - '0';
  
  for(i = 1; i < l; i += 2){
   
   n = expr[i + 1] - '0';
   
   if(expr[i] == '+')
    ans = ans + n;
   if(expr[i] == '-')
    ans = ans - n;
   if(expr[i] == '*')
    ans = ans * n;
  }
  return ans; 
 }
};
これでいい……よね?

Medium(500)
ひどいミスがあったんだ…
#include<vector>
#include<string>
using namespace std;

class GravityBomb{
public:
 vector<string> aftermath(vector<string>);
};

vector<string> GravityBomb::aftermath(vector<string> b){
 int i,j,k,w = b[0].length(),h = b.size();
 string c(w,'X');
 string d(w,'.');
 
 for(i = 0; i < w; i++)
  for(j = 0; j < h; j++)
   for(k = 0; k < h - 1; k++)
    if(b[k][i] == 'X'){
     b[k][i] = b[k + 1][i];
     b[k + 1][i] = 'X';
    }

 for(i = 0; i < h; i++)
  if(b[i] == c)
   b[i] = d;
 
 for(i = 0; i < w; i++)
  for(j = 0; j < h; j++)
   for(k = 0; k < h - 1; k++)
    if(b[k][i] == 'X'){
     b[k][i] = b[k + 1][i];
     b[k + 1][i] = 'X';
    }
 
 return b;
}

なにやったかってXを下に下ろしてから下の文字を上に引っ張っていた。'.'になるところだけどそりゃ'X'のままになるわけだ。
実装であまりにも時間使ったので240pointsくらいになった。これではDiv1はまだまだ遠いなぁ...

0 件のコメント:

コメントを投稿