Increase and Copy
2021.05.01 训练题I
**题目大意:**给你一个数组a,a初始为 [ 1 ] ,给出数据n ,每次你可以选择一种操作:1.选择数组中任何一个数字进行复制,放到数组尾部 2.选择一个数字进行自增1操作 问最终需要最少多少步骤使得数组所有元素之和大于等于n
**思路:**当从1开始复制时,步数为。。。当从2开始复制时,步数为。。。得出当从m开始复制时,步数最少,从m+1开始复制时,步数就开始增多,函数类似于对勾函数。
原题:
Initially, you have the array a consisting of one element 1 (a=[1]).
In one move, you can do one of the following things:
Increase some (single) element of a by 1 (choose some i from 1 to the current length of a and increase ai by one);
Append the copy of some (single) element of a to the end of the array (choose some i from 1 to the current length of a and append ai to the end of the array).
For example, consider the sequence of five moves:
You take the first element a1, append its copy to the end of the array and get a=[1,1].
You take the first element a1, increase it by 1 and get a=[2,1].
You take the second element a2, append its copy to the end of the array and get a=[2,1,1].
You take the first element a1, append its copy to the end of the array and get a=[2,1,1,2].
You take the fourth element a4, increase it by 1 and get a=[2,1,1,3].
Your task is to find the minimum number of moves required to obtain the array with the sum at least n.
You have to answer t independent test cases.
Input
The first line of the input contains one integer t (1≤t≤1000) — the number of test cases. Then t test cases follow.
The only line of the test case contains one integer n (1≤n≤109) — the lower bound on the sum of the array.
Output
For each test case, print the answer: the minimum number of moves required to obtain the array with the sum at least n.
Example
Input
5
1
5
42
1337
1000000000
Output
0
3
11
72
63244
代码实现:
import java.util.Scanner;
public class IncreaseAndCopy {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while(t--!=0) {
int n = sc.nextInt();
int mark = -1;
for(int i=1;i<=n;i++) {
if(i*i>=n) {
mark = i;
break;
}
}
System.out.println(mark*(mark-1)>=n?2*(mark-1)-1:2*(mark-1));
}
}
}