题目描述:T组数据(1<=t<=1000),每组给一个n(1<=n<=109),原始序列为1,每次可以进行如下两个操作之一,问使序列和大于等于n,至少需要多少次操作,操作:1.给某一个数+1 2.将数组中的某一数复制添加到末尾
解题思路:先将1增加到x,再将x复制y份,满足xy>=n。
(假设存在操作序列p,其中操作1进行a次,操作2进行b次,当 每 种 操 作 的 数 量 a 和 b 固 定 时 , 将 操 作 1 全 部 放 在 最 前 面 , 一 定 是 最 优 的 。 当每种操作的数量a和b固定时,将操作1全部放在最前面,一定是最优的。 当每种操作的数量a和b固定时,将操作1全部放在最前面,一定是最优的。)
假设操作1有p次,则操作二有(n-(p+1))/(p+1)=n/(p+1)-1。总操作数为(p+1)+n/(p+1)-2>=2sqrt(n)-2,等号当且仅当p+1==sqrt(n);
accode:
include
include
include
using namespace std;
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
int p1=sqrt(n);
int ans=p1+n/p1+(n%p1!=0)-2;
cout<<ans<<endl;
}
}
date:23,2,25