链接:
2366. 将数组排序的最少替换次数
题意:
一个正整数数组nums,每次操作可以将一个数字拆分成两个数字(C=>A+B),然后放回原来的位置(XCX=>XABX或XBAX),求将这个数组变成非递减数组的最少操作次数
解:
连摇三题困难真是蚌埠住了,前两题写不出来,本来这题也想要摇掉了,看了一眼这题标签是个贪心,又瞄了一眼提示,搞一哈
首先最后一个数字不应该拆,因为要非递减,最后数字越大越好,然后就是平均分可以保留更大的数字
然后从后往前遍历,如果这个数字(now)比后面这个数字(after)大,则我要拆分,同时拆分时要保留最大的数字,则用now/after
计算拆分的组数,注意当now%after!=0
结果需要加一,同时将拆分组数-1(需要次数)加入答案,然后将now拆为now/f
比如21 7,可知拆分为3个7;但是15 7,也是拆分3组(15//7+1),一组就是5(平均分保留最大的数字)
实际代码:
#include<bits/stdc++.h>
using namespace std;
long long minimumReplacement(vector<int>& nums)
{long long int ans=0;if(nums.size()<=1) return 0;auto it=nums.rbegin();for(int after=*it++;it!=nums.rend();it++){int now=*it;if(now>after){int f=now/after;if(now%after) f++;ans+=(f-1);*it=now/f;//cout<<f<<endl;}after=*it;}return ans;
}
int main()
{vector<int> nums;int temp;cout<<"Ctrl + Z to input EOF"<<endl;while(cin>>temp){nums.push_back(temp);}int ans=minimumReplacement(nums);cout<<ans<<endl;return 0;
}
限制:
1 <= nums.length <= 105
1 <= nums[i] <= 109