本文主要是介绍USACO 2023年12月铜组 CANDY CANE FEAST(模拟 思维),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
第一题:CANDY CANE FEAST
标签:思维、枚举、模拟
题意:给定 n n n头牛的初始高度和 m m m个糖果棒的初始高度,每个糖果棒都要 n n n头牛轮流吃一波过去,牛吃了多长的糖果棒,就会长多高。但是每头牛只能吃到小于等于它高度并且有的糖果棒。求最后这 m m m个糖果棒都吃完,这 n n n头牛的高度。( 1 < = n , m < = 2 ∗ 1 0 5 1<=n,m<=2*10^5 1<=n,m<=2∗105,牛和糖果棒高度范围: [ 1 , 1 0 9 ] [1,10^9] [1,109])
先通过样例,再深入理解一下题意。
给定 3 3 3 头牛,每头牛的初始高度分别为 3 、 2 、 5 3、2、5 3、2、5;给定 2 2 2个糖果棒,每个糖果棒的初始高度分别为 6 、 1 6、1 6、1。
第一个糖果棒情况:一开始糖果棒高度 [ 1 , 6 ] [1,6] [1,6],第一头牛(高度为 3 3 3)吃掉 [ 1 , 3 ] [1,3] [1,3]部分,还剩 [ 4 , 6 ] [4,6] [4,6]部分;第二头牛高度(高度为 2 2 2)太低,吃不到;第三头牛(高度为 5 5 5)能吃到糖果棒的 [ 4 , 5 ] [4,5] [4,5]部分。
牛的高度变成 6 、 2 、 7 6、2、7 6、2、7。
第二个糖果棒情况:第一头牛(高度为 6 6 6),能把第二个糖果棒 [ 1 , 1 ] [1,1] [1,1]全部吃掉,增长高度 1 1 1。
牛的高度变成 7 、 2 、 7 7、2、7 7、2、7
题解:把题意理解之后,其实就是一个模拟题。可以维护一下糖果棒目前可以吃的高度区间 [ l , r ] [l,r] [l,r]。当牛的高度完全大于等于 r r r(即能够把糖果棒全部吃掉),那就把目前糖果棒能吃的部分全部加到牛的高度上;如果牛的高度是在 [ l , r ] [l,r] [l,r]中间部分的,那么牛能吃的部分就是牛的高度 a [ j ] a[j] a[j]减去 l l l。注意在枚举的过程中记得维护一下 l l l。( r r r一开始就定好了,没必要去更改)
代码:
#include <bits/stdc++.h>
using namespace std;typedef long long ll;
ll n, m, l, r, k, a[200005];int main() {cin >> n >> m;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= m; i++) {cin >> r;l = 1;for (int j = 1; j <= n; j++) {if (a[j] >= r) {a[j] += r - l + 1;break;}else if (a[j] >= l) {k = a[j];a[j] += a[j] - l + 1;l = k + 1;}}}for (int i = 1; i <= n; i++)cout << a[i] << endl;return 0;
}
这篇关于USACO 2023年12月铜组 CANDY CANE FEAST(模拟 思维)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!