题目链接:https://codeforces.com/contest/1130/problem/E
题目大意:求一个数组中最大的 (R-L+1)*sum(a[i]~a[j]) 题目给出了一种错误的求法,输入一个数x,使正确的的答案是错误的答案+x,构造出这样的a数组
错误的解法就是一旦前缀和小于0了,就抛掉不要,由于是构造题,我们可以简化这个问题。
假设这个数组只有第一项是负的,且为-1,假设数组的总和为sum,那么按照答案的求法一定是
ans= (sum-1)*(n-1)
按照我们的解法是 ans=max(sum*n,(sum+1)*(n-1))
两者做差可以得到 del=sum-n+1,这里的del就是输入的x
在判断的时候是(size+1)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5005;
int main()
{
int k;
cin>>k;
vector<int>vec;
vec.push_back(-1);
int sum=-1;
int sz=1;
while(sum+1-sz<k)
{
sz++;
if(sum+1-sz+1e6<k)
{
vec.push_back(1e6);
sum+=1e6;
}
else
{
vec.push_back(k-(sum+1-sz));
sum+=k-(sum+1-sz);
}
}
cout<<vec.size()<<endl;
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<' ';
}
return 0;
}