ABC196 A 解答
A - Difference Max (9)
問題文
整数 a, b, c, dが与えられます。
a ≤ x ≤ b, c ≤ y ≤ d となるように整数 x, y を選ぶとき、x−y の最大値を求めてください。
制約
入力は全て整数
−100 ≤ a ≤ b ≤ 100
−100 ≤ c ≤ d ≤ 100
考察
計算式を考えて、ぱっと答えを求めてしまいましょう。
本問題では
x - y
の値の最大値を求めます。この数が大きくなるためには、x が非常に大きくて、y が非常に小さければ良さそうですね。x の最大値は b 、 y の最小値は c ですので、これらを使った
b - c
が答えとなります。
実装
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
int main()
{
int a,b,c,d;
cin >> a >> b >> c >> d;
int ans = b-c;
cout << ans <<endl;
return 0;
}
あとがき
上記解法では式から一発で答えを求めましたが、制約が小さいことを利用して、xとyで全ての数字を試しても答えが求まります。
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
int main()
{
int a,b,c,d;
cin >> a >> b >> c >> d;
int ans = -10000;
for(int i = a; i <= b;++i)
{
for(int j = c;j<=d;++j)
{
ans = max(ans,i-j);
}
}
cout << ans <<endl;
return 0;
}
i - j が以前の値よりも大きかったら更新します。ただし、
-100 ≤ x ≤ -90
100 ≤ y ≤ 90
のような場合、その最大値は負の値になりますので、ansの初期値は 0 ではなく、もっと小さい値にセットして置きましょう。
コンテスト中は全探索で解きました。ぱっ、と式が思いつくなら、b-cで計算して、考えるよりも手を動かした方が早いな、と判断したなら全探索を書いてしまいましょう。はやく、バグなく、ACできる方法が正解です。
この記事が気に入ったらサポートをしてみませんか?