题意:n个数的序列a,每一轮选择一个数a[i].
若a[i]在开头或者结尾 则直接删除a[i]
否则将令a[i]=a[i+1]+a[i-1] 并将a[i+1],a[i-1]删除
n<=1e3,-1e9<=a[i]<=1e9.当进行到只有一个数时结束, 要求最后剩下的数最大.输出最后的数和操作序列.
设最后的数为res, res=a[p1]+a[p2]+...a[pk] p[i]为原序列中的下标.
若两个下标的奇偶性不同 则不可能同时出现在序列p中
两个下标奇偶性相同,通过操作中间元素,删3个加一个,距离奇偶性不变 最后将距离缩到2以后相加即可.
若a[i]在开头或者结尾 则直接删除a[i]
否则将令a[i]=a[i+1]+a[i-1] 并将a[i+1],a[i-1]删除
n<=1e3,-1e9<=a[i]<=1e9.当进行到只有一个数时结束, 要求最后剩下的数最大.输出最后的数和操作序列.
设最后的数为res, res=a[p1]+a[p2]+...a[pk] p[i]为原序列中的下标.
若两个下标的奇偶性不同 则不可能同时出现在序列p中
两个下标奇偶性相同,通过操作中间元素,删3个加一个,距离奇偶性不变 最后将距离缩到2以后相加即可.
所以取下标为奇数/偶数中所有的正数即可得到最大值.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const int N=1e3+5;
const ll inf=1e18;
ll n,a[N];
vector<ll> p[2];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
ii mx=ii(-inf,-inf);
for(int i=0;i<2;i++)
{
ll tot=0;
ii mx2=ii(-inf,-inf);
for(int j=0;j<n;j++)
{
if(j%2!=i) continue;
if(a[j]>0)
{
p[i].push_back(j);
tot+=a[j];
}
mx2=max(mx2,ii(a[j],j));
}
if(p[i].size()==0)
{
tot=mx2.first;
p[i].push_back(mx2.second);
}
mx=max(mx,ii(tot,i));
}
vector<ll> arr=p[mx.second],op;
int sz=arr.size();
for(int i=n-1;i>arr[sz-1];i--)
op.push_back(i);
for(int i=0;i<arr[0];i++)
op.push_back(0);
for(int i=0;i<arr.size()-1;i++)
{
int d=arr[i+1]-arr[i];
for(int j=d/2;j>=1;j--)
op.push_back(j);
}
cout<<mx.first<<'\n';
cout<<op.size()<<'\n';
for(int i=0;i<op.size();i++)
cout<<op[i]+1<<'\n';
return 0;
}