結果

問題 No.634 硬貨の枚数1
ユーザー @abcde@abcde
提出日時 2019-05-11 12:43:08
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 5 ms / 2,000 ms
コード長 2,747 bytes
コンパイル時間 1,683 ms
コンパイル使用メモリ 172,080 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-14 18:07:35
合計ジャッジ時間 4,264 ms
ジャッジサーバーID
(参考情報)
judge11 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
4,380 KB
testcase_01 AC 4 ms
4,380 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 AC 4 ms
4,380 KB
testcase_05 AC 2 ms
4,380 KB
testcase_06 AC 3 ms
4,380 KB
testcase_07 AC 2 ms
4,380 KB
testcase_08 AC 4 ms
4,376 KB
testcase_09 AC 3 ms
4,376 KB
testcase_10 AC 2 ms
4,380 KB
testcase_11 AC 4 ms
4,380 KB
testcase_12 AC 2 ms
4,376 KB
testcase_13 AC 4 ms
4,380 KB
testcase_14 AC 4 ms
4,376 KB
testcase_15 AC 4 ms
4,376 KB
testcase_16 AC 4 ms
4,376 KB
testcase_17 AC 4 ms
4,376 KB
testcase_18 AC 4 ms
4,376 KB
testcase_19 AC 2 ms
4,380 KB
testcase_20 AC 3 ms
4,376 KB
testcase_21 AC 4 ms
4,380 KB
testcase_22 AC 4 ms
4,376 KB
testcase_23 AC 4 ms
4,376 KB
testcase_24 AC 4 ms
4,376 KB
testcase_25 AC 3 ms
4,380 KB
testcase_26 AC 3 ms
4,380 KB
testcase_27 AC 4 ms
4,380 KB
testcase_28 AC 3 ms
4,380 KB
testcase_29 AC 3 ms
4,376 KB
testcase_30 AC 4 ms
4,376 KB
testcase_31 AC 3 ms
4,380 KB
testcase_32 AC 4 ms
4,376 KB
testcase_33 AC 3 ms
4,376 KB
testcase_34 AC 4 ms
4,376 KB
testcase_35 AC 4 ms
4,376 KB
testcase_36 AC 4 ms
4,380 KB
testcase_37 AC 4 ms
4,376 KB
testcase_38 AC 4 ms
4,376 KB
testcase_39 AC 4 ms
4,380 KB
testcase_40 AC 4 ms
4,376 KB
testcase_41 AC 4 ms
4,380 KB
testcase_42 AC 4 ms
4,380 KB
testcase_43 AC 4 ms
4,376 KB
testcase_44 AC 2 ms
4,380 KB
testcase_45 AC 3 ms
4,376 KB
testcase_46 AC 3 ms
4,376 KB
testcase_47 AC 3 ms
4,376 KB
testcase_48 AC 3 ms
4,376 KB
testcase_49 AC 2 ms
4,380 KB
testcase_50 AC 4 ms
4,376 KB
testcase_51 AC 3 ms
4,376 KB
testcase_52 AC 2 ms
4,380 KB
testcase_53 AC 4 ms
4,376 KB
testcase_54 AC 4 ms
4,380 KB
testcase_55 AC 4 ms
4,380 KB
testcase_56 AC 4 ms
4,380 KB
testcase_57 AC 4 ms
4,376 KB
testcase_58 AC 4 ms
4,380 KB
testcase_59 AC 4 ms
4,376 KB
testcase_60 AC 4 ms
4,376 KB
testcase_61 AC 4 ms
4,380 KB
testcase_62 AC 4 ms
4,380 KB
testcase_63 AC 4 ms
4,380 KB
testcase_64 AC 4 ms
4,380 KB
testcase_65 AC 4 ms
4,376 KB
testcase_66 AC 4 ms
4,376 KB
testcase_67 AC 4 ms
4,376 KB
testcase_68 AC 5 ms
4,376 KB
testcase_69 AC 4 ms
4,376 KB
testcase_70 AC 4 ms
4,376 KB
testcase_71 AC 4 ms
4,376 KB
testcase_72 AC 4 ms
4,380 KB
testcase_73 AC 4 ms
4,376 KB
testcase_74 AC 4 ms
4,376 KB
testcase_75 AC 4 ms
4,376 KB
testcase_76 AC 4 ms
4,376 KB
testcase_77 AC 2 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// TLE版もくっつけて, 再提出.
// // 計算量要削減(TLE版).
// #include <bits/stdc++.h>
// using namespace std;
// using LL = long long;
// const LL LIMIT = 4500;
// 
// int main() {
//     
//     // 1. 入力情報取得.
//     LL N;
//     cin >> N;
//     
//     // 2. 硬貨準備.
//     map<LL, LL> m;
//     for(int i = 0; i < LIMIT; i++){
//         LL c = (i + 1) * (i + 2) / 2;
//         m[c]++;
//     }
//     
//     // 3. 支払う硬貨をカウント.
//     // i円以下の最小支払い回数を計算していく.
//     // ex.
//     // N = 10001
//     // -> 3回, 46[ms]なので, TLE確定.
//     LL DP[N + 1];
//     DP[0] = 0;
//     for(int i = 1; i < N + 1; i++){
//         if(m[i] > 0) DP[i] = 1;
//         if(m[i] == 0){
//             DP[i] = 1e7;
//             for(int j = 1; j < i / 2 + 1; j++){
//                 DP[i] = min(DP[i], DP[i - j] + DP[j]);
//                 if(DP[i] == 2) break;
//             }
//         }
//     }
//     // for(int i = 0; i < N + 1; i++) cout << DP[i] << " ";
//     
//     // 4. 出力.
//     cout << DP[N] << endl;
//     return 0;
//     
// }
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const LL LIMIT = 4500;  // 上限を, 4500 * 4501 / 2 = 10127250 に 変更.

int main() {
    
    // 1. 入力情報取得.
    LL N;
    cin >> N;
    
    // 2. 硬貨準備.
    map<LL, LL> m;
    for(int i = 0; i < LIMIT; i++){
        LL c = (i + 1) * (i + 2) / 2;
        m[c]++;
    }
    // for(auto &p : m) cout << p.first << endl;
    
    // 3. 支払う硬貨をカウント.
    // i円以下の最小支払い回数を計算していく.
    // -> 10000まで調べると, 1 or 2 or 3 のいずれかだった.
    // なので, 以下のようにロジック変更.
    // ① map に ある … 1回.
    // ② map を巡回しペアが見つかった … 2回.
    // ③ 上記以外 … 3回.
    
    // 3-1. 条件③ を 設定.
    int ans = 3;
    
    // 3-2. 条件② の チェック.
    for(auto &p : m){
        LL a = p.first;
        LL b = N - a;
        // ex.
        // N = 10001    ならば, 3回. (4[ms])
        // N = 10000000 ならば, a=1719585 b=8280415 の 2回. (5[ms])
        // 
        // ex.
        // N = 8
        // -> 2回???
        // -> WA(6 + 1 + 1 の 3枚が最小).
        // -> a=5 b=3 の 謎出力 が 見つかった(a=5 は, map の要素でない筈).
        // if(m[b] > 0){
        if(m[a] > 0 && m[b] > 0){
            // cout << "a=" << a << " b=" << b << endl;
            ans = 2;
            break;
        }
    }
    
    // 3-3. 条件① の チェック.
    if(m[N] > 0) ans = 1;
    
    // 4. 出力.
    cout << ans << endl;
    return 0;
    
}
0