https://codeforces.com/contest/1550/problem/A
INPUT
4
1
8
7
42
OUTPUT
1
3
3
7
题意
定义一个好数组为:ai 中 都存在 ai - 1 或 ai - 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;
}
如有问题请指出,ε=ε=ε=┏(゜ロ゜;)┛