- 原型便是 完全背包问题(滚动数组优化时,循环不需要倒过来写)
- 由于价值过于大,直接循环肯定超时,贪心考虑,大于1e6的部分全部用365填充
#include <iostream>
using namespace std;
typedef long long ll;
const ll inf = 2e18;
const ll N = 1e6 + 10000;
ll c[4] = {0, 7, 31, 365};
ll f[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
for (int i = 0; i < N; ++ i) f[i] = inf;
f[0] = 0;
for (int i = 1; i <= 3; ++ i) {
for (int j = c[i]; j < N; ++ j) {
f[j] = min(f[j], f[j - c[i]] + 1);
}
}
int _; cin >> _;
while (_ -- ) {
ll n;
cin >> n;
ll ans = 0;
if (n > (ll)1e6) {
ans += (n - (ll)1e6) / 365;
n -= 365 * ans;
}
if (f[n] != inf) cout << f[n] + ans << endl;
else cout << -1 << endl;
}
}