A. Find The Array

https://codeforces.com/contest/1550/problem/A

在这里插入图片描述
INPUT

4
1
8
7
42

OUTPUT

1
3
3
7

在这里插入图片描述

题意

定义一个好数组为:ai 中 都存在 ai - 1ai - 2,其中 1 除外。
例如:{1,2,4,6}
a4 有 4
a3 有 2
a2 有 1
1本身除外
所以这是个好数组

题目要求给出T,给出T个数 n ,求最小数量下 的一个好数组的总和sum等于n,输出最小数量

做法

由于数列性质具有递归性质,每个数组必定有1,而且你要最少数量,贪心思想肯定塞入一些大数,所以一开始从1不断塞入 += 2 的数,同时每塞入一个数就减小目标 n 的值,直到小于0,注意此时最后一步的减数肯定大于之前n的剩余值,既然 n剩余 < X塞入的最大数,而我的数列是奇数列,所以我肯定能放入一个刚好等于 n剩余 的数。

例如:n = 11

设x为将要塞入的值,n表示剩下的值

  • x = 1 ,则 n = 10;
  • x = 3 ,则 n = 7;
  • x = 4 ,则 n = 3;
  • x = 5 ,我们发现x > n了,但是不管剩余多少,我们可以放入值为 1~7 的数。
  • 所以答案就是
int q = 0,x = 1;
while(x < n)
{
	n -= x;
	x += 2;
	q++;
}	//程序先循环再判所以已经处理上面x = 5 的情况
cout<<q<<endl;

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int T;	cin>>T;
	int x,q;
	while(T--)
	{
		int n;	cin>>n;
		q = 1;
		x = 1;
		while(n > x)
		{
			n -= x;
			x += 2;
			q++;
		}
		cout<<q<<endl;
	}
	return 0;
}

还有更简单的方法,开方。

#include<bits/stdc++.h>
int main()
{
    int t;cin>>t;
    while(t--)
    {
        int s = read();
        int x = sqrt(s);
        if(x * x < s) x += 1;
        printf("%d\n", x);
    }
    return 0;
}

如有问题请指出,ε=ε=ε=┏(゜ロ゜;)┛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值