但是其实这个题目应该还是比较明显的符合贪心的性质的,那么直接贪一下就好了。
#include#include #include using namespace std; const int maxn=1e3+9; int a[maxn]; int n,k; int work() { int ans=1e9,front,end; int flag=1; for(int i=1;i<=n;i++) { if(flag&&a[i]>a[i+1]) { int t=flag,s=i; while(t>=1&&a[t]>=a[t-1]) t--; while(s<=n&&a[s]>=a[s+1]) s++; if(t>=1||s<=n) { int sum=0,tmp=max(a[t],a[s]); for(int j=t+1;j tmp) sum+=a[j]-tmp; if(sum a[i]) flag=i+1; } int tmp=max(a[front-1],a[end+1]); for(int j=front;j<=end;j++) if(a[j]>tmp) a[j]=tmp; return ans; } int main() { // freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1]=0; int sum=0; bool flag=true; for(int i=1;i<=n;i++) { if(flag&&a[i]>a[i+1]) sum++; if(a[i+1]a[i]) flag=true; } int ans=0; for(int i=sum;i>k;i--) ans+=work(); cout<