CF1481B New Colony 题解
Content
\(n\) 座山排成一行,其中第 \(i\) 座山的高度为 \(h_i\)。
有 \(k\) 个巨石依次从第一座山开始滚落。当某个巨石在第 \(i\) 座山时:
- 如果 \(i=n\),那么巨石直接消失。
- 否则,如果 \(h_i\geqslant h_{i+1}\),那么巨石继续滚落。
- 否则,巨石将在第 \(i\) 座山停下,并使得 \(h_i\) 增加 \(1\)。
请求出第 \(k\) 个巨石最终会落在哪座山上。
数据范围:\(t\) 组数据,\(1\leqslant t,n,h_i\leqslant 100\),\(\bf 1\leqslant k\leqslant 10^9\)。
Solution
你以为这道题目 \(k\) 在 \(10^9\) 级别就不可做了?事实上 \(k\) 到了一定的范围时,后面的巨石就会滚到第 \(n\) 座山然后全部消失。于是我们对于不会消失的巨石直接模拟求出它落在的山的编号,一旦碰到会消失的巨石就直接不用做后面的模拟,因为如上文所述,后面的巨石会滚到第 \(n\) 座山然后全部消失。
Code
namespace Solution {
const int N = 107;
int n, k, h[N];
iv Main() {
MT {
read(n, k);
F(int, i, 1, n) read(h[i]);
int ans = 0;
while(k--) {
int fl = 0;
F(int, i, 1, n) {
if(i == n) {fl = 1; break;}
if(h[i] < h[i + 1]) {h[i]++, ans = i; break;}
}
if(fl) {ans = -1; break;}
}
println(ans);
}
return;
}
}

浙公网安备 33010602011771号