Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

A. Nastya and Rice (Codeforces Round #637 Div. 2)

問題

https://codeforces.com/contest/1341/problem/A

問題概要

n個の袋があり、袋一つの重さはa-bからa+bの間であり袋n個全体の重さはc-dからc+dの間であるという。

n, a, b, c ,dが与えられるので、上記の条件を満たしているかどうかを答えよ。

考察

(a-b) * nから(a+b) * n区間c-dからc+d区間に重なっていれば満たすし、重なっていれば満たしません。

これを言い直すと、(a-b) * nc+dより大きいか(a+b) * nc-dより小さい場合満たさない、となります。なので、それを実装すればよいです。

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, a, b, c, d;
        cin >> n >> a >> b >> c >> d;
        cout << (n * (a - b) > c + d or n * (a + b) < c - d ? "No" : "Yes") << endl;
    }
}

反省

上記のコードはこの記事を書く時に改めて書き直したもので、実戦では慌ててもうちょっと複雑で不必要な場合分けをしてしまいました。

こういう条件はノータイムで出てくるようにならないと・・・。