結果
| 問題 |
No.158 奇妙なお使い
|
| コンテスト | |
| ユーザー |
ふーらくたる
|
| 提出日時 | 2016-09-17 01:32:52 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,842 bytes |
| コンパイル時間 | 569 ms |
| コンパイル使用メモリ | 60,124 KB |
| 実行使用メモリ | 93,952 KB |
| 最終ジャッジ日時 | 2024-11-17 08:09:50 |
| 合計ジャッジ時間 | 58,605 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 18 TLE * 9 |
ソースコード
#include <iostream>
#include <cstring>
#include <tuple>
using namespace std;
int memo[11][101][10001];
int a1000, a100, a1,
db, b1000, b100, b1,
dc, c1000, c100, c1;
tuple<int, int, int> how_to_pay(int sum, int num1000, int num100, int num1) {
int use1000, use100, use1;
use1000 = min(sum / 1000, num1000);
sum -= use1000 * 1000;
use100 = min(sum / 100, num100);
sum -= use100 * 100;
use1 = min(sum / 1, num1);
sum -= use1 * 1;
return make_tuple(use1000, use100, use1);
}
int solve(int num1000, int num100, int num1) {
if (memo[num1000][num100][num1] >= 0) {
return memo[num1000][num100][num1];
}
// 貨幣を大きい方から使っていけば良い
int res = 0, use1000, use100, use1;
tuple<int, int, int> payment;
// Bさんと交換
payment = how_to_pay(db, num1000, num100, num1);
use1000 = get<0>(payment);
use100 = get<1>(payment);
use1 = get<2>(payment);
if (1000 * use1000 + 100 * use100 + use1 == db) {
res = max(res, solve(num1000 - use1000 + b1000,
num100 - use100 + b100,
num1 - use1 + b1) + 1);
}
payment = how_to_pay(dc, num1000, num100, num1);
use1000 = get<0>(payment);
use100 = get<1>(payment);
use1 = get<2>(payment);
if (1000 * use1000 + 100 * use100 + use1 == dc) {
res = max(res, solve(num1000 - use1000 + c1000,
num100 - use100 + c100,
num1 - use1 + c1) + 1);
}
return res;
}
int main() {
cin >> a1000 >> a100 >> a1;
cin >> db;
cin >> b1000 >> b100 >> b1;
cin >> dc;
cin >> c1000 >> c100 >> c1;
memset(memo, -1, sizeof(memo));
cout << solve(a1000, a100, a1) << endl;
return 0;
}
ふーらくたる