Vacaciones de invierno súper largas 2020 [gmoj2182] [comer ovejas y ovejas comiendo hierba] [similar al prefijo y]

Descripción del título

Después de la clase, los corderos fueron al pasto a comer hierba. Mientras que Yangcun está actualmente inspeccionando la demostración característica de Yangcun, los líderes quieren ver los pastos de Yangcun.
Los pastizales en Yangcun se distribuyen continuamente, hay diferentes cantidades de ovejas que pastan en cada pastizal. Los líderes querían ver varios pastos consecutivos, pero no querían ver más que ovejas T. El jefe de la aldea esperaba que los líderes vieran más del estilo de Yangcun y visitaran tantos pastos como fuera posible.
Ahora, ayude al jefe de la aldea a decidir qué sección del pasto llevar a los líderes a visitar para cumplir con los requisitos de los líderes y del jefe de la aldea.

De entrada

La primera línea tiene enteros N y T, que indican cuántos pastos consecutivos hay en Yangcun y los líderes quieren ver el número máximo de ovejas.
En la segunda línea, hay N enteros, separados por un espacio entre los dos enteros. El número i-ésimo ai significa que todas las ovejas están comiendo hierba en el i-ésimo pasto. Los números varían de 1 a N.

Salida

Se genera una línea de dos números, que indica el número del punto de inicio y el número del punto final de la visita, separados por espacios. La dirección del viaje es siempre de números pequeños a grandes. Además, si existe la posibilidad de la misma longitud, se genera la respuesta con un número de punto de partida más pequeño. Los datos garantizan que al menos existe una respuesta.

Entrada de muestra

5 10
6 3 2 1 7

Salida de muestra

2 4

Limitación del rango de datos

30% de datos, 1 <= N <= 100;
60% de datos, 1 <= N <= 1000;
100% de datos, 1 <= N <= 100000, 0 <= ai <= 10 9 , 0 < = T <= 2 31 -1.

Pronto

Para cumplir con el número total de no más de 10 consecutivos, hay dos posibilidades de 3 + 2 + 1 y 2 + 1 + 7, salida prioritaria de 2 a 4 pastos.

Análisis

Hablemos primero del método de 70 puntos: el prefijo directo y el doble ciclo posterior enumeran cada intervalo y luego lo comparan.
Código:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,a[100010],t,mx,mi,mj;
int main()
{
    freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	scanf("%d%d",&n,&t);
	for(register int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		a[i]=a[i-1]+a[i];
	}
	for(register int i=1;i<=n-1;i++)
	{
		for(register int j=n;j>=i+1;j--)
		{
			if(a[j]-a[i-1]<=t)
			{
				if(j-i+1>mx)
				{
					mx=j-i+1;
					mi=i;
				    mj=j;
				    break;
				}
			}
		}
		if(n-i<=mj-mi) break;
	}
	printf("%d %d",mi,mj);
	fclose(stdin);
	fclose(stdout); 
    return 0;
}

Solución positiva:
la esencia de este problema es la secuencia continua más larga con un peso no mayor que t.
Usando un método similar a la suma del prefijo, agregue un poco de optimización para completar la tarea.

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,j,x,y,sum,a[100100];
int main()
{
	freopen("eat.in","r",stdin);
	freopen("eat.out","w",stdout);
	cin>>n>>m; 
	int j=1;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
		while(sum>m)//保证当前草场可以参观
		{
			sum-=a[j++];
		}
		if(i-j+1>y-x+1)
		{
			x=j;
			y=i;
		}		
	}
	cout<<x<<' '<<y;
} 

110 artículos originales publicados · 100 alabanzas · 8007 visitas

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/105185325
Recomendado
Clasificación