Codeforces Round # 633 (Div. 2) C. Adición potenciada

Título:
Dar una secuencia un un puede ser yo yo segundos amúltiples elementos encualquierposición 2 X - 1 2 ^ {x-1} , pregunta por el mango un un ¿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 yo yo 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;
}
141 artículos originales publicados · 71 elogiados · 60,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/sinat_40872274/article/details/105485726
Recomendado
Clasificación