結果
| 問題 |
No.297 カードの数式
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-04-28 11:19:13 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 2,836 bytes |
| コンパイル時間 | 1,316 ms |
| コンパイル使用メモリ | 166,896 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-12-15 07:18:56 |
| 合計ジャッジ時間 | 2,205 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
int main() {
// 1. 入力情報取得.
int N;
cin >> N;
vector<char> n;
int plus = 0, minus = 0;
for(int i = 0; i < N; i++){
char c;
cin >> c;
if(c == '+') plus++;
if(c == '-') minus++;
if(c >= '0' && c <= '9') n.push_back(c);
}
// 2. sort.
sort(n.begin(), n.end());
// 3. 数式の構成要素を生成.
int nCount = plus + minus + 1; // 数字は, 記号よりも1個多い.
// 記号を保存.
// ex. '+', '-', '-' なら, '+': 2回, '-': 2回 とみて, 保存.
LL sign[nCount];
for(int i = 0; i <= plus; i++) sign[i] = 1;
for(int i = plus + 1; i < nCount; i++) sign[i] = -1;
// 3-1. 最大値
// A + B + C - D, A + B + C, A - B - C などを想定.
LL aMax = 0;
vector<LL> vMax(nCount, 0);
for(int i = 0; i < nCount; i++){
LL ll = 0;
if(i == 0){
// 数字(n.size()): 8個, 記号(nCount): 4個, なら 5, 1, 1, 1 に, 分割.
for(int j = 0; j < n.size() - nCount + 1; j++){
ll *= 10;
ll += n[n.size() - 1 - j] - '0';
}
vMax[i] = ll;
}
if(i > 0){
ll += n[nCount - 1 - i] - '0';
vMax[i] = ll;
}
}
for(int i = 0; i < nCount; i++) aMax += vMax[i] * sign[i];
// cout << "vMax: ";
// for(auto &p : vMax) cout << p << " ";
// cout << endl;
// 3-2. 最小値
// A + B + C - D, A + B + C, A - B - C などを想定.
LL aMin = 0;
vector<LL> vMin(nCount, 0);
// '-' が, 1個以上あるとき.
if(minus > 0){
for(int i = 0; i < nCount; i++){
LL ll = 0;
if(i == nCount - 1){
// 数字(n.size()): 8個, 記号(nCount): 4個, なら 1, 1, 1, 5 に, 分割.
for(int j = 0; j < n.size() - nCount + 1; j++){
ll *= 10;
ll += n[n.size() - 1 - j] - '0';
}
vMin[i] = ll;
}
if(i < nCount - 1){
ll += n[i] - '0';
vMin[i] = ll;
}
}
}
// '-' が, 無いとき.
if(minus == 0){
for(int i = 0; i < n.size(); i++){
int id = i % nCount;
LL ll = n[i] - '0';
vMin[id] *= 10;
vMin[id] += ll;
}
}
// cout << "vMin: " << " #minus=" << minus << "# ";
for(int i = 0; i < nCount; i++) aMin += vMin[i] * sign[i];
// for(auto &p : vMin) cout << p << " ";
// cout << endl;
// 5. 後処理.
// ex.
// 12
// 8 9 9 2 1 0 5 + 3 9 7 1
// -> 9998753211 26388 で, OK ???.
cout << aMax << " " << aMin << endl;
return 0;
}
@abcde