今天心血来潮想练一下贪心,然后就自己想了一道题出来。
对于一个长度为 n 的数列 a,将数列分成 m 段,而每一段分出来的所有数都要减去相应的值,求怎么分段才能使得最后数列中大于 0 的数的个数最多。
举个例子,对于数列 3 4 2 3 1 7,需要分成 3 段并且每一段减去的值分别为 1 5 8,我们可以分成 3 4 2 3,1 和 7 总共三段,减去相应的值后整个数列变成了 2,3,1,2,−4,−1 总共有四个大于 0 的数。
本人想的就是用下面的代码,正着跑一遍,然后倒序 a 数组和 b 数组再倒着跑一遍,最后取两个答案的最大值。
for(int i=1;i<=n;i++)
{
if(n-t+1==n-i+1) sum+=(a[i]>b[t]),t++;
else if(a[i]>b[t])
{
if(t<m&&a[i]<=b[t+1]) sum++;
else if(t==m) sum++;
else if(t<m&&a[i]>b[t+1])
{
if(b[t+1]<b[t]) t++;
}
}
else
{
if(t<m&&a[i]<=b[t+1]) t++;
else if(t==m) continue;
else if(t<m&&a[i]>b[t+1]) t++;
}
}