题解:P12249 [科大国创杯初中组 2025] 果汁

· · 题解

由于是从左往右倒的,那么靠右的杯子满了对小奶龙更加友好(他更有可能喝到果汁)。所以我们进行贪心,每次贪心地倒入编号更大的杯子。如果编号更大的杯子已满,就倒入另一杯。如果两杯都已满,答案就可以加 1

#include <bits/stdc++.h>
using namespace std;
const int N = 3e4+9;
int t,n,m,v[N],a;
int main()
{
    cin >> t;
    while (t--) // t 组数据
    {
        cin >> n >> m;
        for (int i = 1; i <= m; ++i) cin >> v[i]; // 容量
        int ans = 0;
        while (n--) // 倒 n 次,a[j] 不用存储
        {
            cin >> a;
            if (v[a + 1]) // 编号较大的杯子还能倒,就倒
                --v[a + 1]; // 倒入,剩余容量 -1
            else if (v[a]) // 否则尝试编号较小的杯子
                --v[a];
            else // 两杯均满,喝掉
                ++ans; // 答案 +1
        }
        cout << ans << endl;
    }
    return 0;
}