アルゴ式やってるかい?
プログラミングをやりたくてこの部活に入ってきた人たちは「アルゴ式」を知っているかな?
アルゴ式はプログラム初心者でも簡単にプログラミングを学べるし、難しいことも学べるとても素晴らしいサイトなんだ!
今日の問題
今日はそんなアルゴ式のとある1問を解説していくぜ
問題
正の整数 N,M が与えられます。
3 つの正の整数の組 x,y,z であって、
- x,y,z はそれぞれ 1 以上 N 以下の整数である
- x,y,z の総和は M 以下である
という条件をともに満たすものが何個あるかを求めてください。
入力
入力は次の形式で与えられます。
N M
また、入力される値は次の制約を満たします。
- N は 1 以上 2000 以下の整数
- M は 1 以上 3N 以下の整数
入力例
2 4
出力例
4
条件を満たす x,y,z は次の 4 つです。
- (x,y,z)=(1,1,1)
- (x,y,z)=(1,1,2)
- (x,y,z)=(1,2,1)
- (x,y,z)=(2,1,1)
コード
解答例(ランタイムエラー)
int n,m,x,y,z;
long long ans = 0;
for (int x = 1; x <= n; ++x) {
for (int y = 1; y <= n; ++y) {
for (int z = 1; z <= n; ++z) {
if (x + y + z <= m) ++ans;
}
}
}
この文ではfor文が3重にかかってしまっています
プログラム的には間違ってないけど長すぎてプログラムがエラーになってしまいます
なので減らせるfor文は削っていきましょう
解答例(正解)
int n,m,k; cin>>n>>m; long long ans=0; for(int i=1; i<n+1; i++){ for(int j=1; j<n+1; j++){ k=min(n,m-i-j); if(k<=0)continue; ans+=k; } } cout<<ans;
この文ではfor文が2回しか使われてないのでこれくらいならランタイムエラーにはならないです
- 「i」で最初の数字を設定する
- 「j」で次の数字設定
- iとjの合計がmを超えない かつ n以下 で最後の数を設定(kはnかm-i-jの小さいほう)
- kが0より小さかったら2つ目の数を増やして設定しなおし
- kが0より大きかったらkの分答えに足す
- ループが終わったら答えを出力
let’s programming
この部活でプログラミングをやってみたい人はアルゴ式やってみよう
プログラミングをよくやっている人も!!
コメント