题目链接
题目大意:
给定数字n和m。让我们构造出一个大小为n的正整数数组ans。有两个条件:
- 数组必须是一个严格递增数组,而且数组中的数不能超过109。
- 数组必须包含m个三元组其中三元组(i,j,k)要满足 ans[i]+ans[j] = ans[k],(1≤i<j<k≤n)。
解题思路:
我们可以看出一种构造就是假设当前数为cur,此时的m为0,我们假设k=cur+1。则之后的数组为cur+k,cur+2k,cur+3k,…cur+m*k,则后面这些数的两两的差肯定为k的倍数,但是我们cur后面构造的数都没有k的倍数。因为cur前面的数都是小于k,所以cur前面的数也不可能。所以我们可以根据这种构造策略应对m=0的情况。
如果m不等于0,我们可以看出按1,2,3,4,5这样构造会使得生成的三元组最多。所以我们先贪心把m用完,然后再按上面的策略构造。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[6000],m;
int main()
{
ll n;
cin>>n>>m;
ll k=2;
a[1]=1;
for (int i=2;i<=n;i++)
{
if (m==0)
{
a[i]=a[i-1]+k;
continue;
}
if (m>(i-1)/2)
{
a[i]=i;
m-=(i-1)/2;
}
else
{
ll r=i-1,l=i-m*2;
a[i]=a[l]+a[r];
m=0;
k=a[i]+1;
}
}
if (m>0)
{
cout<<-1;
return 0;
}
for (int i=1;i<=n;i++)
cout<<a[i]<<" ";
}