题目链接
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; } }