結果
| 問題 |
No.297 カードの数式
|
| コンテスト | |
| ユーザー |
moti
|
| 提出日時 | 2015-11-29 22:40:51 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 2,109 bytes |
| コンパイル時間 | 1,204 ms |
| コンパイル使用メモリ | 110,416 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-26 02:24:23 |
| 合計ジャッジ時間 | 2,124 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <complex>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <iomanip>
#include <assert.h>
#include <array>
#include <cstdio>
#include <cstring>
#include <random>
#include <functional>
#include <numeric>
using namespace std;
#define REP(i,a,b) for(int i=a;i<(int)b;i++)
#define rep(i,n) REP(i,0,n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
#define minimize(a, x) a = std::min(a, x)
#define maximize(a, x) a = std::max(a, x)
using ll = long long;
int const inf = 1<<29;
vector<int> ds;
int N;
int p, m;
void append(ll& x, int a) {
x *= 10; x += a;
}
ll number(vector<int>::iterator begin, vector<int>::iterator end) {
ll num = 0;
for(auto iter = begin; iter != end; iter++) {
num *= 10;
num += *iter;
}
return num;
}
ll calc_max() {
sort(ds.rbegin(), ds.rend());
int D = ds.size();
ll max = number(ds.begin(), ds.begin() + D - p - m);
rep(i, p) max += *(ds.begin() + i + D - p - m);
rep(i, m) max -= *(ds.begin() + i + D - m);
return max;
}
ll calc_min() {
int D = ds.size();
ll min = 0;
if(m == 0) {
sort(all(ds));
int arr[p+1]; zero(arr);
int curr = 0;
rep(i, ds.size()) {
arr[curr] *= 10;
arr[curr++] += ds[i];
curr %= p+1;
}
min = accumulate(arr, arr + p+1, 0);
}
else {
sort(ds.rbegin(), ds.rend());
min = ds[D-1];
auto dt = vector<int>(ds.begin(), ds.end() - 1);
D = dt.size(); // p(>=0), m(>0) 符号の個数
min -= number(dt.begin(), dt.begin() + (D - p - m + 1));
rep(i, m-1) min -= *(dt.begin() + i + (D - p - m + 1));
rep(i, p) min += *(dt.begin() + i + (D - p));
}
return min;
}
int main() {
cin >> N;
rep(i, N) {
char ch; cin >> ch;
if(isdigit(ch)) { ds.push_back(ch-'0'); }
if(ch == '+') {
p ++;
}
if(ch == '-') {
m ++;
}
}
cout << calc_max() << " " << calc_min() << endl;
return 0;
}
moti