1 条题解
-
1
又是一个数据大小特别水的题
思路
注意到,可以随便造。注意到如果你在中间放回某一些数,你再取数就不方便了(因为会挡住某一些数),所以说放回的操作一定要在最后进行。因此,我们可以枚举最后会剩下那一段数,再把选中的数进行排序,用剩下的操作数把它们一个一个的放回去,再在过程中更新即可。思路还是挺简单的,不清楚为何评绿。
AC代码
#include<bits/stdc++.h> #define int long long using namespace std; const int N=55; int a[N],n,m,s[N]; signed main() { scanf("%lld%lld",&n,&m);//读入 for(int i=1;i<=n;i++)scanf("%lld",&a[i]),s[i]=s[i-1]+a[i];//还是读入 int ans=0; for(int len=max(n-m,0ll);len<=n;len++)for(int i=1;i+len-1<=n;i++)//枚举区间长度len和起始点i { int j=i+len-1;//通过长度和起始点计算结束点 prority_queue<int,vector<int>,greater<int> >Q;//邪恶阎帝防止直接抄袭 for(int k=1;k<i;k++)Q.push(a[k]);//把选中的点放入小根堆中 for(int k=j+1;k<=n;k++)Q.push(a[k]); ans=max(ans,s[n]-s[j]+s[i-1]);//什么也不放也要计算 for(int k=1,sum=0;k<=m-(n-len)&&Q.size();k++)//一个一个的弹出 { int x=Q.top();Q.pop(); sum+=x;ans=max(ans,s[n]-s[j]+s[i-1]-sum);//ans更新 } } printf("%lld\n",ans);//输出 return 0;//完结撒花 }
- 1
信息
- ID
- 11667
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 134
- 已通过
- 8
- 上传者