1 条题解

  • 1
    @ 2026-6-10 18:34:50

    又是一个数据大小特别水的题

    思路

    注意到1N50,1K1001\leq N\leq 50,1\leq K\leq 100,可以随便造。注意到如果你在中间放回某一些数,你再取数就不方便了(因为会挡住某一些数),所以说放回的操作一定要在最后进行。因此,我们可以枚举最后会剩下那一段数,再把选中的数进行排序,用剩下的操作数把它们一个一个的放回去,再在过程中更新ansans即可。思路还是挺简单的,不清楚为何评绿。

    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
    上传者