F - Education
题意
有一个人 为了存够 c c c 元 每一天有两种操作
- 可以选择在当前职位工作一天并拿到 a [ i ] a[i] a[i] 元钱
- 如果当前存款多于 b [ i ] b[i] b[i] 可以升职到下一个职位(下一个职位的日工资更高)
a [ i ] a[i] a[i] 和 b [ i ] b[i] b[i] 都是递增数组
问:至少要多少天才能存够 c c c 元
思路
因为 a [ i ] a[i] a[i] 是递增的 所以如果要升职就要尽早升职
遍历 a [ i ] a[i] a[i] 计算出当前工资下需要多少天 取最小值 存在 m i n n minn minn 中
然后判断升职的情况 如果能升职就直接升职 否则计算在当前工资下需要多少天能够升职
每步操作更新 d a y day day
代码
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
const int N = 200050;
int n, c;
int a[N], b[N];
void solve() {
cin >> n >> c;
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= n - 1; ++i)
cin >> b[i];
int minn = LLONG_MAX;
int day = 0;
int money = 0;
for (int i = 1; i <= n; ++i) {
minn = min(minn, day + ((c - money) + a[i] - 1) / a[i]); //若一直在当前位置 需要多少天
// 升职的情况
if (i == n)break;
if (money >= b[i]) { //如果够升职 直接升职
money -= b[i];
day++;
}
else {
int x = ((b[i] - money) + a[i] - 1) / a[i]; // 还要工作多少天才能升职
money = money + x * a[i] - b[i];
day += x;
day++; //升职花费一天
}
}
cout << minn << endl;
}
signed main() {
int t; cin >> t;
while (t--)
solve();
return 0;
}