Codeforces1426 C. Increase and Copy(思维,均值不等式)

    科技2022-07-13  125

    题意:

    你有一个序列,一开始只有一个元素1, 一次操作你可以选择一种进行: 1.将序列末尾的元素+1 2.设序列末尾的数为x,添加一个值为x的元素到序列的末尾,即复制。

    给定n,问最少用多少次操作,能使得序列的总和>=n。

    数据范围:n<=1e9

    解法:

    假 设 存 在 操 作 序 列 p , 其 中 操 作 1 进 行 a 次 , 操 作 2 进 行 b 次 , 假设存在操作序列p,其中操作1进行a次,操作2进行b次, p1a2b

    当 每 种 操 作 的 数 量 a 和 b 固 定 时 , 将 操 作 1 全 部 放 在 最 前 面 , 一 定 是 最 优 的 。 当每种操作的数量a和b固定时,将操作1全部放在最前面,一定是最优的。 ab1

    那 么 我 们 只 需 要 考 虑 一 开 始 进 行 多 少 次 操 作 1 , 后 面 全 是 操 作 2 那么我们只需要考虑一开始进行多少次操作1,后面全是操作2 12

    − − − ---

    假 设 操 作 1 进 行 p 次 , 那 么 操 作 2 需 要 进 行 ⌈ n − ( p + 1 ) p + 1 ⌉ = ⌈ n p + 1 ⌉ − 1 次 假设操作1进行p次,那么操作2需要进行\lceil \frac {n-(p+1)}{p+1} \rceil=\lceil \frac {n}{p+1} \rceil-1次 1p2p+1n(p+1)=p+1n1

    那 么 总 操 作 次 数 为 p + ⌈ n p + 1 ⌉ − 1 = [ ( p + 1 ) + ⌈ n p + 1 ⌉ ] − 2 那么总操作次数为p+\lceil \frac {n}{p+1} \rceil-1=[(p+1)+\lceil \frac {n}{p+1} \rceil]-2 p+p+1n1=[(p+1)+p+1n]2

    均 值 不 等 式 : ( p + 1 ) + n p + 1 > = 2 ∗ s q r t ( n ) 均值不等式:(p+1)+\frac {n}{p+1}>=2*sqrt(n) :(p+1)+p+1n>=2sqrt(n)

    那 么 当 ( p + 1 ) 取 ⌊ s q r t ( n ) ⌋ 时 , [ ( p + 1 ) + ⌈ n p + 1 ⌉ ] − 2 最 小 那么当(p+1)取\lfloor sqrt(n) \rfloor时,[(p+1)+\lceil \frac {n}{p+1} \rceil]-2最小 (p+1)sqrt(n),[(p+1)+p+1n]2

    code:

    #include<bits/stdc++.h> using namespace std; signed main(){ int T;cin>>T; while(T--){ int n;cin>>n; int p1=sqrt(n);//p+1取sqrt(n) int ans=p1+n/p1+(n%p1!=0)-2;//(n%p1!=0)是为了上取整 cout<<ans<<endl; } return 0; }
    Processed: 0.010, SQL: 8