# CF1898B Milena and Admirer
题目链接
# 题目大意
给出一个长度为 的数组 ,你可以将数组中任意一个数 分成两个数 ,求使该数组非严格递增的最小操作数
# 思路
容易发现,无论如何操作,数组中的数都会小于等于数组中最后一个数并大于等于第一个数
所以可以贪心的从后往前遍历数组,碰到 的情况就分裂 ,这时候为了确保后续操作数更少,我们需要让分裂出的最小数尽可能大,所以不妨考虑将 尽可能平均分成 份,此时分裂出的数保证最大数 ,最小数 即可
# 代码
#include<bits/stdc++.h> | |
#define int long long | |
#define in inline | |
#define ri register | |
#define _123hh2 0 | |
using namespace std; | |
in int read() | |
{ | |
int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();} | |
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}return x*f; | |
} | |
in void write(int x) {if(x<0) {x=-x;putchar('-');}if(x>9) write(x/10);putchar(x%10+'0');} | |
const int maxn=2e5+1; | |
int awa[maxn]; | |
signed main() | |
{ | |
int t=read(); | |
while(t-->0) | |
{ | |
int n=read(),now,cnt=0; | |
for(int i=1;i<=n;i++) awa[i]=read(); | |
now=awa[n]; | |
for(int i=n-1;i>=1;i--) | |
{ | |
if(awa[i]>now) | |
{ | |
int x=awa[i]/now-1; | |
if(awa[i]%now) x++; | |
cnt+=x; | |
now=awa[i]/(x+1); | |
} | |
else now=awa[i]; | |
} | |
write(cnt),puts(""); | |
} | |
return _123hh2; | |
} |