結果
| 問題 | No.297 カードの数式 | 
| コンテスト | |
| ユーザー |  bal4u | 
| 提出日時 | 2019-07-07 13:25:44 | 
| 言語 | C (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1 ms / 1,000 ms | 
| コード長 | 1,635 bytes | 
| コンパイル時間 | 303 ms | 
| コンパイル使用メモリ | 31,488 KB | 
| 実行使用メモリ | 5,248 KB | 
| 最終ジャッジ日時 | 2024-10-04 13:22:50 | 
| 合計ジャッジ時間 | 1,233 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 23 | 
ソースコード
// yukicoder: No.297 カードの数式
// 2019.7.7 bal4u
#include <stdio.h>
#include <string.h>
#define gc() getchar()
int in() {   // 非負整数の入力
	int n = 0, c = gc();
	do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');
	return n;
}
char p, m, f[10]; int N;
int main()
{
	int i;
	long long a, mi, ma;
	char pp, mm, g[10];
	N = in();
	for (i = 0; i < N; i++) {
		int a = gc(); gc();
		if (a == '+') p++;
		else if (a == '-') m++;
		else f[a & 0xf]++;
	}
	
	// 最大値
	ma = 0, pp = p, mm = m;
	memcpy(g, f, sizeof(g));
	for (i = 0; i < 10 && (mm | pp); i++) if (g[i]) {
		if (mm) {
			if (mm >= g[i]) { mm -= g[i], ma -= i*g[i], g[i] = 0; continue; }
			ma -= i*mm, g[i] -= mm, mm = 0;
		}
		if (pp) {
			if (pp >= g[i]) pp -= g[i], ma += i*g[i], g[i] = 0;
			else ma += i*pp, g[i] -= pp, pp = 0;
		}
	}
	a = 0; for (i = 9; i >= 0; i--) {
		while (g[i]) a = a * 10 + i, g[i]--;
	}
	ma += a;
	
	// 最小値
	mi = 0;
	if (m) {
		m--, a = -1;
		for (i = 0; i < 10; i++) if (f[i]) {
			if (a < 0) {
				a = i;
				if (--f[i] == 0) continue;
			}
			if (p) {
				if (p >= f[i]) { p -= f[i], mi += i*f[i], f[i] = 0; continue; }
				mi += i*p, f[i] -= p, p = 0;
			}
			if (m) {
				if (m >= f[i]) m -= f[i], mi -= i*f[i], f[i] = 0;
				else mi -= i*m, f[i] -= m, m = 0;
			}
		}
		mi += a, a = 0;
		for (i = 9; i >= 0; i--) {
			while (f[i]) a = a * 10 + i, f[i]--;
		}
		mi -= a;
	} else {
		int k = ++p, s = 0;	long long b = 1;
		for (i = 9; i >= 0; i--) {
			while (f[i]) {
				s += i, f[i]--;
				if (--k == 0) mi += b*s, k = p, s = 0, b *= 10;
			}
		}
		mi += b*s;
	}
	printf("%lld %lld\n", ma, mi);
	return 0;
}
            
            
            
        