题目:
题意解析:
指定x,y,x是要输出的数组的长度,y是当前数组的子数组和为正数的个数,答案有很多种,请输出其中一种。
题解:
(1)一个数组长度为 x 的时候,这个数组的所有子数组的个数是x*(x+1)/2;我们这个利用这一点来做这个题目。
(2)从1到n遍历,第i个元素能实现的最大的子数组的个数是 i*(i+1)/2。
<1> 判断一下y是否是>=i*(i+1)/2,如果是的话。就输出正整数(这里是除了1都可以,后面会解释)。
<2> 还有一种情况就是输入为2 2的情况,这个时候,按下面的代码,第一个输出为3,第二个输出应该是-2或者-1。这种情况的判断就是( y < i*(i+1)/2)&& ( y > i*(i-1)/2).。这个时候就要确定一下要输出的值了。
<3> 最后一种判断就是( y < i*(i+1)/2)&& ( y <= i*(i-1)/2),就直接输出为能输出的最大负数了。.
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
while(n--) {
int x,y;
cin>>x>>y;
for(int i=1; i<=x; i++) {
//保证前i个数是正数并且正数子序列的个数在y个之内
if(y>=i*(i+1)/2) {
cout<<3<<' ';
} else if(y>i*(i-1)/2) {
cout<<(i-(y-i*(i-1)/2))*-3+1<<' ';
} else {
cout<<-1000<<' ';
}
}
cout<<endl;
}
return 0;
}