题目链接
https://www.luogu.com.cn/problem/CF1200B
解题思路
贪心。
大佬的话言简意赅:能把当前的砖能拿的尽量拿走,如果高度不够补到打擦边球。
挺好想的,但是就是两个核心代码没调整好,wa了四发都没过。
AC代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=110;
int T,n,m,k,f,h[N];
int main()
{
cin>>T;
while(T--)
{
f=0;memset(h,0,sizeof h);
cin>>n>>m>>k;
for(int i=1;i<=n;i++) cin>>h[i];
for(int i=1;i<n;i++)
{
if(m+h[i]+k<h[i+1])
{
f=1;
break;
}
m-=min(m,max(h[i+1]-h[i]-k,0));//注意这里的处理方式//若h[i+1]-h[i]-k为负值,不能让m变大。
m+=max(0,min(h[i]-h[i+1]+k,h[i]));//注意这里的处理方式//添加到背包的不能比当前所在列的石头还多
/*
//AC
if(h[i]-h[i+1]+k>=0) m+=min(h[i]-h[i+1]+k,h[i]);
else m-=h[i+1]-h[i]-k;
if(m<0)
{
f=1;
break;
}
*/
}
if(!f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
京公网安备 11010502036488号