CF1550A Find The Array(贪心算法)

Let's call an array a  consisting of nn positive (greater than 00) integers beautiful if the following condition is held for every ii from  1 to  n: either ai=1  or at least one of the numbers ai−1  and ai−2  exists in the array as well.

For example:

  • the array [5,3,1] is beautiful: for a1 , the number a1−2=3 exists in the array; for  a2, the number a2−2=1 exists in the array; for  a3, the condition a3=1 holds;
  • the array [1,2,2,2,2] is beautiful: for  a1, the condition a1=1  holds; for every other number  ai, the number ai−1=1  exists in the array;
  • the array [1,4]  is not beautiful: for a2 , neither a2−2=2  nor a2−1=3  exists in the array, and  a2≠1;
  • the array [2]  is not beautiful: for a1 , neither  a1−1=1 nor  a1−2=0 exists in the array, and a1≠1 
  • the array [2,1,3] is beautiful: for a1 , the number a1−1=1  exists in the array; for  a2, the condition a2=1  holds; for  a3, the number a3−2=1  exists in the array.

You are given a positive integer ss. Find the minimum possible size of a beautiful array with the sum of elements equal to  s.

Input

The first line contains one integer t  (1≤t≤5000 ) — the number of test cases.

Then t lines follow, the i-th line contains one integer  s (1≤s≤5000 ) for the  i-th test case.

Output

Print tt integers, the  i-th integer should be the answer for the i -th testcase: the minimum possible size of a beautiful array with the sum of elements equal to ss.

Example

Input

4
1
8
7
42

Output

1
3
3
7

Note

Consider the example test:

  1. in the first test case, the array [1] meets all conditions;
  2. in the second test case, the array [3,4,1] meets all conditions;
  3. in the third test case, the array [1,2,4] meets all conditions;
  4. in the fourth test case, the array  [1,4,6,8,10,2,11] meets all conditions.

题目分析就是我们

一个数组 a 是好的当且仅当数组内每一个数  ai​ 满足:  ai​=1 或   ai​−1=aj​ 或  ai​−2=aj​ 。

给出一个好数组的元素之和 x  ,求好数组的元素个数最小值。 

思路

本题用贪心做,每次放的数尽量大,即每个数比前一个数多 2  。如果最后一个数放不下,那么就把最后一个数减小到刚好放下,元素个数不变。

具体实现看代码

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n,sum1=0,sum2=0;
		cin>>n;
		for(int i=1;i<=500000;i+=2)
		{
			sum1+=i;
			sum2++;
		
		if(sum1>=n)
		{
			cout<<sum2<<endl;
			break;
		}
		}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法编程张老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值