Sum on Subarrays

该文描述了一个编程问题,涉及计算数组长度x时所有子数组的个数,并根据给定的正数子数组个数y找出可能的一种情况。通过遍历从1到n,判断不同条件下输出的数值,包括当y大于等于i*(i+1)/2时输出3,y在特定区间时计算并输出特定数值,否则输出最大负数。提供的C++代码实现了这一逻辑。
摘要由CSDN通过智能技术生成

 题目:

题意解析:

指定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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值