見出し画像

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できる方法が正解です。

この記事が気に入ったらサポートをしてみませんか?