Título:
Dar una secuencia
puede ser
segundos amúltiples elementos encualquierposición
, pregunta por el mango
¿Cuál es el número mínimo de segundos para que convierta en unasecuenciano decreciente?
Ideas
Dado que el tiempo mínimo para convertir la secuencia en una secuencia no decreciente, debe serel tiempo requeridopara complementar los dos números que están en pares de orden inverso y tienen la mayor diferencia en el estado no decreciente(porque puede elegir cualquier número, entonces Cuando se complementa el orden inverso de la diferencia máxima, todo lo demás se puede hacer en este proceso).
Si decides la hora, solo pon La suma sumable de segundos se puede comparar con la diferencia. Cuando la suma sumable es mayor o igual que la diferencia por primera vez, es la respuesta.
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+7;
int n,m,cas;
ll b[N],a[100],s[100];
//求 i时刻 的可加数和
void init(){
a[1] = 1;
s[1] = 1;
for(int i = 2; i <= 32; ++i){
a[i] = a[i-1]*2;
s[i] = a[i]+s[i-1];
}
}
int main(){
init();
scanf("%d",&cas);
while(cas--){
int ans = 0;
scanf("%d",&n);
for(int i = 1;i <= n; ++i)
scanf("%lld",b+i);
ll maxx = b[1],sub=0;
for(int i = 2; i <= n; ++i){
maxx = max(maxx,b[i]);//maxx为b[1]~b[i]的最大值
sub = max(sub,maxx-b[i]);//sub为b[1]~b[i]的最大差值
for(int j = 0; j <= 33; ++j)
if(sub <= s[j]){
ans = max(ans,j);//找到b[1]~b[i]中补齐最大差值所需的时间,并取一个最大值
break;
}
}
printf("%d\n",ans);
}
return 0;
}