公式

A - Timeout 解説 by MtSaka


初心者の方へ

この問題は与えられた数列 \(T\) が長老が寝てしまう条件を満たしているか判定して YesNo か答える問題です。

この問題では現在ちょうど肩を叩いた瞬間のため、\(T_0=0\) であるとします。

では、まず長老が寝てしまう条件を考えましょう。\(T_i\) 秒後に肩を叩かれるときまでは長老が起きているとします。この後、\(T_{i+1}-T_i \leq S\) のときは長老は\(T_i\) 秒後に肩を叩かれてから \(T_{i+1}\) 秒後に肩を叩かれるまで寝ません。しかし、 \(T_{i+1}-T_i > S\) のとき、長老は \(T_i+S+0.5\) 秒後\((<T_{i+1})\) に寝てしまいます。

つまり、\(T_{i+1}-T_i >S\) を満たす \(i(0 \leq i \leq N-1)\) が存在するとき、長老が寝てしまいます。

数列 \(T\) をfor文を用いて入力し、その後それぞれの \(i\) についてfor文とif文を用いることで判定することでこの問題が解くことができます。実装の際は寝る条件をある \(i\) で満たしたときにすぐNo と出力しプログラムを終了させる方法や、条件を満たす \(i\) が存在するかのフラグを持つ真偽値を管理する方法があります。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, s;
    cin >> n >> s;
    vector<int> t(n + 1, 0);
    for (int i = 1; i <= n; ++i)
        cin >> t[i];
    for (int i = 1; i <= n; ++i) {
        if (t[i] - t[i - 1] > s) { // 寝るか判定
            cout << "No" << endl;
            return 0; // プログラムを終了
        }
    }
    cout << "Yes" << endl;
}

実装例(Python)

n, s = map(int, input().split())
t = list(map(int, input().split()))
if t[0] > s:
    print("No")
    exit()
for i in range(1, n):
    if t[i] - t[i - 1] > s: #寝るか判定
        print("No")
        exit() #プログラムを終了
print("Yes")

投稿日時:
最終更新: