题解 | #小红的踏前斩#

小红的踏前斩

https://ac.nowcoder.com/acm/problem/262058

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
void solve(){
	int n;cin>>n;
	vector<int> a(n+1);
	for(int i=1;i<=n;i++) cin>>a[i];
	int ans=0;
	for(int i=n-2;i>=1;i--){
		int t=min({a[i],a[i+1]/2,a[i+2]/3});
		ans+=t*5;
		a[i]-=t;
		a[i+1]-=2*t;
		a[i+2]-=3*t;
	}
	for(int i=1;i<=n;i++) ans+=a[i];
	cout<<ans;
}
signed main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	solve();
	return 0;
}

想了一会,大概清楚了
一般来说,大部分人都会写成从前向后贪心,但是会有问题
对于一个用例,其中任何一个数可以写成 N = 3X + 2Y + Z + C
每一个c都是孤立的,无法构成1,2,3的形式,所以,问题就变成了,先贪心3还是1,很明显,如果从前往后贪心,那么可能会贪掉后面的部分2和1,造成后面无法构成1,2,3,但是从后往前贪心,由于最后一个必定只能贪3,所以对前面无影响

全部评论

相关推荐

我要娶个什么名:学长你电脑闹鬼了
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务