USACO/DEC/BR1

P9974 [USACO23DEC] Candy Cane Feast B

题目传送门

分析

我们想一下每个牛只能吃到的糖果有多少呢?

牛高为 $ni [i] $ ,糖果被吃的高度为 $ mn $

那我们只需每次判断 $ni [i] $ 是否大于 $ mn $ ,牛低的话吃不到,牛高的话能吃的为 $ni [i] $ 以下到 $ mn $ 或者为糖果的高度到 $ mn $ ,那我们发现糖果减少的高度也是从下往上连续的一段位置

那减少的高度又是多少呢?

能吃到的时候就证明牛比 $ mn $ 高,$ mn $ 为牛高或者糖果最大高度

最后枚举即可

AC code

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	long long ni[200005],mi[200005];
	for(int i=1;i<=n;i++)cin>>ni[i];//h
	for(int i=1;i<=m;i++)cin>>mi[i];//l
	for(int i=1;i<=m;i++){
		int mn=0; //记录吃后的高度 
		for(int j=1;j<=n;j++){
			if(ni[j]>mn){ //如果比当前吃的高度(悬空的)还高,可以吃 
				if(ni[j]>mi[i]){ //比当前糖还高,把糖全吃了 
					ni[j]+=mi[i]-mn;
					break;
				}
				int f=ni[j];
				ni[j]+=ni[j]-mn;
				mn=f;
			}
		}
	}
	for(int i=1;i<=n;i++) cout<<ni[i]<<endl;
	return 0;
}
posted @ 2023-12-20 21:11  Nijika  阅读(15)  评论(0)    收藏  举报