結果
| 問題 |
No.708 (+ー)の式
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-05-25 03:23:25 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,593 bytes |
| コンパイル時間 | 1,416 ms |
| コンパイル使用メモリ | 170,844 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-17 15:01:22 |
| 合計ジャッジ時間 | 1,997 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
// subtask_7.txt, subtask_10.txt で, WAとなったので, ロジック修正.
// -> if(befX == '#') ans = c; を 追加.
// -> (1-2)+(3-4) = -2 を計算できるようになった.
#include <bits/stdc++.h>
using namespace std;
int main(){
// 1. 入力情報取得.
string S;
cin >> S;
// 2. 括弧ごとに計算.
int ans = 0;
vector<char> v;
bool isBracket = false;
char curX, befX = '#';
for(int i = 0; i < S.size(); i++){
curX = S[i];
// 2-1. 左括弧来たら, フラグ を true に 変更.
if(curX == '('){
isBracket = true;
continue;
}
// 2-2. 右括弧来たら, フラグ を false に 変更.
if(curX == ')'){
isBracket = false;
int c = 0;
char bef = '#';
for(auto &cur : v){
if(cur == '+' || cur == '-') bef = cur;
if(cur != '+' && cur != '-'){
if(bef == '#') c = (cur - '0');
if(bef == '+') c += (cur - '0');
if(bef == '-') c -= (cur - '0');
}
// cout << "cur=" << cur << " c=" << c << endl;
}
if(befX == '#') ans = c; // subtask_7.txt, subtask_10.txt での WA対策.
if(befX == '+') ans += c;
if(befX == '-') ans -= c;
// cout << "isBracket=" << isBracket << " befX=" << befX << " curX=" << curX << " c=" << c << " ans=" << ans << endl;
// v を 初期化.
v = vector<char>();
continue;
}
// 2-3. 括弧以外は, 保存 or 計算.
if(isBracket) v.push_back(curX);
if(!isBracket && curX != '+' && curX != '-'){
if(befX == '#') ans = (curX - '0');
if(befX == '+') ans += (curX - '0');
if(befX == '-') ans -= (curX - '0');
// cout << "isBracket=" << isBracket << " befX=" << befX << " curX=" << curX << " ans=" << ans << endl;
}
// 2-4. 前回 の '+' or '-' を 保存.
if((curX == '+' || curX == '-') && !isBracket) befX = curX;
}
// 3. 出力 ~ 後処理.
// ex.
// 0-(1-2)+(3+4)-5+6-(7+8+9)+0+1+2+3+4+5 = 0
// 5-(3-2+4)+(3-7-4+1)-5+6-0-(7+2+9)+5+0+1-2+3-4+(5+9)-3+7 = -3
// のはず.
//
// (1-2)+(3-4) = -1 が出力されたことに注意(正解は, -2 の はず).
// -> subtask_7.txt, subtask_10.txt での WA の 原因と推測されるもの.
cout << ans << endl;
return 0;
}
@abcde