CodeForces Round #713 (Div. 3) F - Education (贪心)

简介: 笔记

F - Education


题意

有一个人 为了存够 c 元 每一天有两种操作


可以选择在当前职位工作一天并拿到a[i] 元钱

如果当前存款多于 b[i] 可以升职到下一个职位(下一个职位的日工资更高)

a[i] 和b[i] 都是递增数组


问:至少要多少天才能存够 c 元


思路

因为a[i] 是递增的 所以如果要升职就要尽早升职


遍历a[i] 计算出当前工资下需要多少天 取最小值 存在minn 中


然后判断升职的情况 如果能升职就直接升职 否则计算在当前工资下需要多少天能够升职


每步操作更新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;
}


目录
相关文章
|
6月前
【CodeForces】Codeforces Round 857 (Div. 2) B
【CodeForces】Codeforces Round 857 (Div. 2) B
142 0
Codeforces Round 640 (Div. 4)
Codeforces Round 640 (Div. 4)A~G
101 0
Codeforces Round 859 (Div. 4)题解
Codeforces Round 859 (Div. 4)题解
106 0
|
人工智能 BI
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
Codeforces Round #805 (Div. 3) 题解
|
机器学习/深度学习 人工智能 BI
Codeforces Round #751 (Div. 2) D. Frog Traveler(bfs 优化)
Codeforces Round #751 (Div. 2) D. Frog Traveler(bfs 优化)
137 0
|
人工智能