题目链接

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;
    }
}