SRM510 Div2 Medium - TheLuckyGameDivTwo

解法

 最初にn以下の数字の中でLucky Numberはいくつあるかを計算しておき、両者が選べる数字の範囲について全探索すればいい。

コード

#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

class TheLuckyGameDivTwo {
public:
    int find(int a, int b, int jLen, int bLen) {
        vector<int> num(b + 1, 0);
        for (int i = 1; i <= b; i++) {
            num[i] = num[i - 1] + isLucky(i);
        }

        int ans = 0;
        for (int i = a; i <= b - jLen + 1; i++) {
            int tmp = INT_MAX;
            for (int j = i; j <= i + jLen - bLen; j++) {
                tmp = min(tmp, num[j + bLen - 1] - num[j - 1]);
            }
            ans = max(ans, tmp);
        }
        return ans;
    }
private:
    bool isLucky(int n) {
        for (char c : to_string(n)) {
            if (c != '4' && c != '7') {
                return false;
            }
        }
        return true;
    }
};