题目描述
给定 n n n和初始数组,其中 a [ 1 ] = 1 a[1]=1 a[1]=1,每次操作可以让数组中的一个元素++,或者复制一个元素到空白位置,最少多少次操作让数组元素之和到达 n n n.
题目思路
那我现在可以告诉大家题目的真正意图了
其实就是给你一个元素,你可以选择让他加 1 1 1或者复制一个
我们口胡一下样例就能发现规律了
其实这种题要么是从加到一半开始复制,要么就是加到根号的位置开始复制
加到一半显然不可能,最后一组样例
1000000000 1000000000 1000000000如果加到一半显然不符合标准
我们来试加到 n n n的根号
假如是样例中的 42 42 42,平方根为 6 6 6(取整)
我们加到 6 6 6需要 5 5 5次操作
然后再复制6次就能到 42 42 42了
刚好 11 11 11次
其他样例也是如此
机房大佬说可以用对勾函数证明,蒟蒻只会口胡,大家有什么可以严格证明的方法可以发到评论区分享
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
long long n;
cin>>n;
int x=sqrt(n);
int ans=x-1;//次数
long long sum=x;
while(sum<n){
sum+=x;
ans++;
}
cout<<ans<<endl;
}
return 0;
}