题意:给出一个数组,可以对任意元素进行拆分,比如ai,可以拆分为x和ai-x,并且放在ai两边,然后删除ai,求用最小次数将数组变为不递减的数组

思路:首先假设从前面开始拆分,我们发现我们会受到后面的数的影响,所以这里要考虑从后面开始拆分,假如说当前的数v[i],小于v[i+1]那么很明显没有必要拆分,假如不符合要求,那么怎么拆分呐,比如说7,6,我们需要对7进行拆分,那么拆分就是拆分为3,4,我们取较小的放在原位,较大的可以看作放到后面了,那怎么拆分呐,就向上取整的用7/6,得到的数假设为t,那么t-1就是操作的次数,而7/t向下取整,无疑就能得到最小的拆分值

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

void test() {
ll n;
cin >> n;
vector<ll> v(n+1);
for(int i = 1; i <= n; i++) {
cin >> v[i];
}
ll cn = 0; // 重置计数器
for(int i = n-1; i >= 1; i--) {
if(v[i] <= v[i+1]) continue;
ll t = (v[i]+v[i+1]-1) / v[i+1]; 
int f=(v[i+1] * t);
cn+=t-1;
v[i] =v[i]/t;
}
cout << cn << endl;
}

signed main() {
ll t;
cin >> t;
while (t--) {
test();
}
return 0;
}

PS:这里学到了一个小知识,(v[i]+v[i+1]-1)/v[i+1],这个就是用向上取整来求v[i]/v[i+1]的方法

posted on 2023-12-30 19:26  塔罗-太阳  阅读(7)  评论(0)    收藏  举报