Codeforces 1305 E. Kuroni and the Score Distribution(构造)

题目链接
题目大意:
给定数字n和m。让我们构造出一个大小为n的正整数数组ans。有两个条件:

  1. 数组必须是一个严格递增数组,而且数组中的数不能超过109
  2. 数组必须包含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]<<" ";
}
发布了12 篇原创文章 · 获赞 1 · 访问量 327

猜你喜欢

转载自blog.csdn.net/qq_41818939/article/details/104657060