题解:P14257 嫉妒(jealousy)

· · 题解

TJ P14257

前言

一道看似困难实则简单的题目。不需要数学,仅需 2for 循环轻松拿下。

Analysis

题目中仅给出了 4 个变量,这种题根据经验一般为数学题。但是看过 Tag 变量范围:

发现其实可以暴力枚举。

具体如何枚举呢?

首先,枚举一个时刻 i 表示面试进行的场数。枚举一个变量 j 表示小 Y 转的圈数。枚举范围,由

具体地,他会在第 y + j × t 分钟在面试间门口。

i 场面试的时间为从第 (i − 1) × s 分钟到第 i× s 分钟。

可知,应为 0n \cdot t 之间。

判断是否正好撞上小 Y 时,可以判断上一场面试开始与结束的时间是否与小 Y 在面试间门口时间相等。

因此,就很好写出代码了:

Code

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, y, s, t; // n: 面试的场数; y: 来的时刻; s: 面试持续的时间; t: 巡逻一圈的时间
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> y >> s >> t;

    for (int i = 1; i <= n; i++) { // i: 面试的场数
        int sk1 = (i - 1) * s; 
        int sk2 = i * s; // 两个时刻
        bool flag = true; // 是否有一个符合题意的时刻
        for (int j = 0; j * t + y <= n * s; j++) {
            if (j * t + y == sk2 || j * t + y == sk1) {
                flag = false;
                break;
            }
        }
        if (flag) {
            cout << "Yes";
            goto end; // 不想写 return 0
        }
    }

    cout << "No";
    end:
    return 0;
}