Problem - C - Codeforces
题意:
给定n和k,让你构造一个长度为k的数列,使其差分数组的数的种类尽可能多
思路:
贪心+构造
种类尽可能多,那就让1 ,+1之后+2,+3,....一直加,直到不能加为止
什么时候不能加呢?
这是个构造题,我们需要保证能够构造出长度为k的数组,这个是构造的条件
我们在构造过程中要想办法保证构造的条件被满足
因此我们需要预留出几个空位,使得这几个空位加上前面已经选的长度加起来要不少于 k
因此我们可以去维护这样给位置:
一开始在n-k
然后每加一个数,它就向右移一格,这样就能保证加起来刚好等于k了,当前面构造的数超过这个位置的时候停止加
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
void solve(){cin>>k>>n;int t=n-k;int now=1,pre=1;cout<<1<<' ';for(int i=2;i<=k;i++){if(t>=now-1)t-=(now-1),cout<<pre+now<<' ',pre=pre+now,now++;else cout<<pre+1<<' ',pre=pre+1;}cout<<endl;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __=1;cin>>__;while(__--)solve();return 0;
}
总结:
构造题,确定好要满足的构造条件
我们在构造过程中要想办法保证构造的条件被满足