chacoderのブログ

競技プログラミングそのほか

ABC045C/ARC061C - たくさんの数式

問題

C - Many Formulas

1以上9以下の数字からなる長さ10までの文字列の好きな場所に+を挿入します。
1つも入れなくてもかまいません。
できた文字列を数式とみてその値の合計値を求めます。

考察

2か月ほど前に一度解いた問題でしたが解きなおしてみました。
けんちょんさんのAtCoder版蟻本初級編にも取り上げられている1問です。

qiita.com




bit全探索自体は(ライブラリをひっぱってきてですが)書けたのですがその余の実装部分が難しい問題です。

結局自力では書ききれず解説ACになりました。

緑difは埋めたのですが解説ACで自力で書けなくなっているものがまだまだあると思いますので復習しながら進みたいと思います。

実装のポイント

入力を文字列で受け、bit全探索で加号の挿入位置を全通りためします。

加号が入らない場合はtempで持っている値を10倍しその桁の文字列を数字に変換したものを加えます。

加号がでてきたら従前のtempをansに加え、tempを0にリセットします。

文字列の末尾まできたら残っているtempをansに加えます。

ACしたコード

#include <bits/stdc++.h>
using namespace std;

int main() {
  //入力
  string S;
  cin>>S;
  int len=S.length();
  long long temp=0;
  long long totalans=0;

  //bit全探索
  for(int i=0;i<(1 <<(len-1));i++){
    temp=0;
    for(int j=0;j<len;j++){
      temp=temp*10;
      temp+=S.at(j)-'0';
      if(i&(1<<j)){
        //cout<<"###"<<temp<<endl;
        totalans+=temp;
        temp=0;
      }
    }
    //cout<<"#"<<temp<<endl;
    totalans+=temp;
  }
  
  cout<<totalans<<endl;
  return 0;       
}