結果

問題 No.634 硬貨の枚数1
ユーザー @abcde
提出日時 2019-05-11 12:24:02
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
WA  
実行時間 -
コード長 1,345 bytes
コンパイル時間 1,372 ms
コンパイル使用メモリ 164,572 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-07-02 01:09:19
合計ジャッジ時間 3,340 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2 WA * 1
other AC * 16 WA * 59
権限があれば一括ダウンロードができます

ソースコード

diff #

#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(int i = 0; i < LIMIT; i++) cout << coins[i] << 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    ならば, a=5051    b=4950    の 2回. (4[ms])
        // N = 10000000 ならば, a=1719585 b=8280415 の 2回. (5[ms])
        if(m[b] > 0){
            ans = 2;
            break;
        }
    }
    
    // 3-3. 条件① の チェック.
    if(m[N] > 0) ans = 1;
    
    // 4. 出力.
    cout << ans << endl;
    return 0;
    
}
0