The League of Sequence Designers

题目是构造题
先从最简单的条件开始,因为规定n<2000;
所以绝对给不了大于2000的序列;
因为L只给定最小值,所以干脆让L最大;
即L=1999;
题目所给的错误的算法,是在最大连续子序列和(dp)的基础上,乘以序列长度,所以构造一个除第一个数以外,使序列和不断递增的序列;
即 对于 2<=i<=1999 ai>0;
a1为负数 不如让 a1=-1;
a2~a1999为正数 不如使其大于1;
考虑必须大于k,所以构造
i=2~1999 sum(ai)=1999+k;
这样就构造出了错误的序列和 1998*(1999+k)
和正确的序列和 1999*(1998+k)
相减恰好为k;
需要注意的是 每一项最大只有 10^6 所以如果直接将k加到某一项 会wa
代码如下:

#include 
using namespace std;

//构造题
int main(){
    int t,k,l;
    cin>>t;
    while(t--){
        cin>>k>>l;
        if(l>=2000 ){
            printf("-1\n");
            continue;
        }
        cout<<1999<<endl;
        cout<<-1<<" ";
        for(int i=2;i<=1998;i++){
            cout<<1+(k/1997)<<" ";
        }
        cout<<2+(k-(k/1997)*1997)<<endl;
    }
    return 0;
}

你可能感兴趣的:(icpc)