注意
・AtCoderの A - Task Scheduling Problem のネタバレあり。
・読みにくいから頭の中が整理出来次第更新していく。
ACしたコード
#include <stdio.h>
int main(void)
{
int a123[4];
for (int i = 0; i < 3; i++)
{
scanf("%d",&a123[i]);
// printf("%d ",a123[i]);
}
// printf("\n");
//ここから昇順ソート
int i;
int j;
int tmp = 0;
for (i = 0; i < 3; i++)
{
for (j = i + 1; j < 3; j++)
{
if (a123[i] > a123[j])
{
tmp = a123[i];
a123[i] = a123[j];
a123[j] = tmp;
}
}
}
// 並べ替え結果の表示
for ( i= 0 ; i < 3; i++)
{
// printf("a123[i]=%d ", a123[i]);
}
// printf("\n");
int sum = 0;
for (int i = 0; i < 2; i++)
{
sum += a123[i + 1] - a123[i];
// printf("sum=%d\n", sum);
}
printf("%d\n", sum);
return (0);
}
実行結果
入力例1:
1_6_3
出力結果1:
5
期待する出力1:
5
入力例2:
11_5_5
出力結果2:
6
期待する出力2:
6
入力例3:
100_100_100
出力結果3:
0
期待する出力2:
0
方針(仮)
[1] int型でa1,a2,a3を標準入力から受け取る。
[2] int型で受け取った値を配列、a123[4]に代入する。
※変数a1の値をa123[4]に代入できたが、変数a2の値を代入した時に、a1の値がa2の値に上書きされている事に気づき、[3]以降に着手できない。
↓↓↓↓↓↓ [1],[2] を変更 ↓↓↓↓↓↓
[1] 標準入力から受け取る変数をa123[4];という配列で受け取る。
[2] a123[4];という配列をバブルソートの昇順にする。
[3] for文でiを1〜3回まで回して、以下のイメージで引き算をする。
a123[1] - a123[0]
a123[2] - a123[1]
配列a123[i]の値のa123[0]が 0 、a123[1]が 1 、a123[2]が 6 の値が出力されるので[4]以降に着手できない。
↓↓↓↓↓↓ [3] を変更 ↓↓↓↓↓↓[3] for文の i の範囲は、0〜2回までにして上記のイメージで引き算をする。
[4] int sum = 0;の変数に引き算した結果を代入する。
※代入すると値が上書きされるので以下のイメージの結果をint sum = 0;に足し算していく。
a123[1] - a123[0]
a123[2] - a123[1]
↓↓↓↓↓↓ [4] を変更 ↓↓↓↓↓↓
[4] int sum = 0;の変数にa123の配列の値の引き算した結果を足し算する。
[5] for文を抜けてint sumの変数に引き算の結果を出力する。
ACする方針まとめ
[1] 標準入力から受け取る変数をa123[4];という配列で受け取る。
[2] a123[4];という配列をバブルソートの昇順にする。
[3] for文の i の範囲は、0〜2回までにする。
[4] int sum = 0;の変数にa123の配列の値の引き算した結果を足し算する。
[5] for文を抜けてint sumの変数に引き算の結果を出力する。
メモ
// 最後のループ
for(int i = 0; i < 3; i++){
sum += a123[i - 1] a123[i];
}
//にすると、a123[1] - a123[i]が計算されてマイナスの値になる可能性があるので
for(int i = 0; i < 2; i++){
sum += a123[2] - a123[i]
}
//の計算で終わるようにループで引き算する回数を1回分減らす。
・バブルソートを使う事が増えたからバブルソートの関数を昇順と降順バージョンを作ってスニペットにしたい。