A. Upload More RAM
题目大意
上传nGB内存,连续k秒内最多只能上传1GB,要求求出上传nGB要的最小秒数。
思路
n、k的数据范围在100之内,按题意模拟即可。
代码实现
void solve() {
ll n, k; cin >> n >> k;
ll ans = 0;
while (n != 1) {
ans += k;
n -= 1;
}
cout << ans + 1 << "\n";
}
B. K-Sort
题目大意
给定一个序列,给定以下操作:
-
首先选择一个k,1<=k<=n,支付k+1个硬币。
-
选择恰好k个索引,使每个索引的值加一。
要求求出让整组序列非递减所需最小硬币数。
思路
首先我们可以观察到,每次操作选择不同索引,加的数目均为1,可知产生的贡献为k,支付k+1个硬币。这个贡献k为我们选取的个数,所以我们要让整组序列变成非递减的过程中,只有k+1中的1会产生额外价格,我们最小化这个1的数量即可。
所以我们每次操作时,尽可能大的选择k的值,然后常数1的数量应该为需要改变最多的值的数量。
代码实现
void solve() {
ll n; cin >> n;
vector<ll>o(n);
for (int i = 0; i < n; i++) {
cin >> o[i];
}
ll mx = 0;
ll ans = 0;
for (int i = 0; i < n; i++) {
if (i + 1 < n && o[i] > o[i + 1]) {
ans += o[i] - o[i + 1];
mx = max(mx, o[i] - o[i + 1]);
o[i + 1] = o[i];
}
}
cout << ans + mx << "\n";
}
C. Basil's Garden
题目大意
给定一排n朵花,每朵花有他的初始高度h。
每秒钟,风从左边吹来,导致hi>hi+1的花的高度降低1。
求最小经历多长时间,所有花的高度均为0。
思路
我们可以发现,对于每一朵花,我们只需要观察他右侧的花的高度,以及右侧花什么时候倒即可将答案转移过来。当高度要小于等于右侧花的高度的时候,就需要进行转移。
代码实现
void solve() {
ll n; cin >> n;
vector<ll>h(n);
for (int i = 0; i < n; i++) {
cin >> h[i];
}
for (int i = n - 2; i >= 0; i--) {
if (h[i] <= h[i + 1]) {
h[i] = h[i + 1] + 1;
}
}
cout << h[0] << "\n";
}