水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

ABC 027 D - ロボット

回答

残念な30点分
Submission #468312 - AtCoder Beginner Contest 027 | AtCoder

ちゃんとしたやつ
Submission #468314 - AtCoder Beginner Contest 027 | AtCoder

これも解説の開放通りですね.
考察が難しいような気がしました.ABCと言ってもD問題はまだまだ厳しいですね.精進しないと.
http://www.slideshare.net/chokudai/abc027

とにかく考察ゲーでした.
文字列を全部読み込んで,Mの時に配列に書き込んで・・・
書き込まれた配列をソートして,前半と後半に分けて〜 みたいな感じになるのですが,これ一人で溶ける気がしないなあ^^;

とりあえず解説を見ながら通せたものの,完全には理解できていません.
30点分はDPで行けるそうですが(私の30点回答はDPでもなく,100点回答に無駄なループが入っているだけ),思いつけてもそこが限界のような気がします.
頭を柔軟にしていろいろなところから考察するスキルも求められているような気がする.

スキルを上げるためには技術的な知識をつけることも大切ですが,こういった発想・考察面での知識もつけていかないとなあと実感した1問でした.

もう少しがんばりましょう.

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
 
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
#define INF 1<<30
#define MP make_pair
#define mp make_pair
#define pb push_back
#define PB push_back
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define ll long long
#define ull unsigned long long
 
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    string s;
    cin >> s;
 
    int n = s.length();
    vector<int> data;
    int t = 0;
    REP(i, n) {
        if(s.at(i) == 'M') {
            data.pb(t);
        }  else if(s.at(i) == '+') {
            t++;
        } else if(s.at(i) == '-') {
            t--;
        }
    }
 
    sort(data.begin(), data.end());
    int dn = data.size();
    int res = 0;
    REP(i, dn)      res += dn / 2 > i ? -data[i] : data[i];
 
   cout << res << endl;
 
    return 0;
}

いい感じにC++使えるようになっているので,桁の範囲数とか考慮した上でPythonなどと使い分けて行けそうです( ・`ω・´)