目次
1. トピックの紹介
王は忠実な騎士たちに賃金として金貨を与えました。
初日、騎士は金貨 1 枚を受け取り、次の 2 日間 (2 日目と 3 日目) には毎日 2 枚の金貨を受け取り、次の 3 日間 (4 日目、5 日目、6 日目) には 3 枚の金貨を受け取ります。毎日金貨 ; 次の 4 日間 (7 日目、8 日目、9 日目、10 日目)、毎日 4 枚の金貨を受け取りました...; この給与分配モデルはこのように続きます。
N 日間連続して毎日 N 個の金貨を受け取った後、騎士は N+1 日間連続して毎日 N+1 個の金貨を受け取ります。
過去 K 日間に騎士が獲得した金貨の枚数を計算してください。
タイトル出典: Niu Ke BC96
2. トピックの要件
説明を入力してください:
入力には 1 行のみがあり、金貨を発行する日数を表す正の整数 K が含まれています。
出力の説明:
出力は 1 行のみで、騎士が受け取った金貨の数を示す正の整数が含まれます。
3. 問題解決のアイデア
上図に示すように、三角形の尖塔と同様に、各列のアイテムの数は列の数と同じであり、各列のアイテムの数で表される金貨の数はその数と同じです。行の。
したがって、行数×項目数、つまりi * j または i * i の 問題である回折によって求めることができます。
したがって、行数を金貨の数として設定することができ、列内のアイテムがすべてなくなると、次の行に入力して金貨の数を増やすことができます。ある日。
そして日数が近づくにつれて歩けるアイテムの数はどんどん減っていきますので、残りの日数でこのラインのアイテムをすべてクリアできるかどうかを日数で判断する必要があります。
数学モデルに変換すると、次のようになります。
k を日数としましょう。
i をアイテムの数とし、i は金貨の数を表す行数も表します。
i * i は、列内のすべての項目を完了する金貨の数であり、列内の金貨の合計数を示します。
sum = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +………+i * i (k>=i)—— 行内の項目数を完了できることを示します
sum = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +………+ k * i (k<i) ——旅を終えることができず、残り日数があることを示します
4. コードのデモ
int main()
{
int k;
int i = 1;
int result = 0;
scanf("%d", &k);
while (k > 0)
{
if (k >= i)
result += i * i;
else
result += k * i;
k -= i; //天数在不断的减少
i++; //完成 一行后 金币数需要加1
}
printf("%d\n", result);
return 0;
}
//k > = i 表示当天数大于等于项数时,可以走完一行,所以使用 i * i ,行数(金币数) × 项数
//k < i 表示当天数小于项数时,则要求该项所在的行数(金币数) * 天数 得到剩余天数的所有金币