[CodeForces] Codeforces Ronda # 677 (Div. 3) C. Piraña dominante (pensamiento)

C.
Límite de tiempo de piraña dominante
por prueba Límite de memoria de 2 segundos por prueba 256 megabytes de
entrada Entrada
estándar Salida Salida estándar
Hay n pirañas con tamaños a1, a2,…, una en el acuario. Las pirañas están numeradas de izquierda a derecha para que vivan en el acuario.

Los científicos de la Universidad Estatal de Berland quieren averiguar si hay pirañas dominantes en el acuario. La piraña se llama dominante si puede comerse a todas las demás pirañas del acuario (excepto a sí misma, por supuesto). Otras pirañas no harán nada mientras que la piraña dominante se las comerá.

Debido a que el acuario es bastante estrecho y largo, la piraña solo puede comerse una de las pirañas adyacentes durante un movimiento. Piranha puede hacer tantos movimientos como necesite (o como pueda). Más precisamente:

La piraña i puede comerse la piraña i − 1 si la piraña i − 1 existe y ai − 1 <ai.
La piraña me puedo comer la piraña i + 1 si la piraña i + 1 existe y ai + 1 <ai.
Cuando la piraña i come alguna piraña, su tamaño aumenta en uno (ai se convierte en ai + 1).

Su tarea es encontrar cualquier piraña dominante en el acuario o determinar si no existen tales pirañas.

Tenga en cuenta que debe encontrar cualquier piraña dominante (exactamente una), no tiene que encontrarlas todas.

Por ejemplo, si a = [5,3,4,4,5], entonces la tercera piraña puede ser dominante. Considere la secuencia de sus movimientos:

La piraña se come la segunda piraña y a se convierte en [5,5–, 4,5] (la piraña subrayada es nuestro candidato).
La piraña se come la tercera piraña y a se convierte en [5,6–, 5].
La piraña se come la primera piraña y a se convierte en [7–, 5].
La piraña se come a la segunda piraña y a se convierte en [8–].
Tienes que responder t casos de prueba independientes.

Entrada
La primera línea de la entrada contiene un número entero t (1≤t≤2⋅104) - el número de casos de prueba. Luego siguen t casos de prueba.

La primera línea del caso de prueba contiene un número entero n (2≤n≤3⋅105) - el número de pirañas en el acuario. La segunda línea del caso de prueba contiene n números enteros a1, a2,…, an (1≤ai≤109), donde ai es el tamaño de la i-ésima piraña.

Se garantiza que la suma de n no exceda 3⋅105 (∑n≤3⋅105).

Salida
Para cada caso de prueba, imprima la respuesta: -1 si no hay pirañas dominantes en el acuario o índice de ninguna piraña dominante en caso contrario. Si hay varias respuestas, puede imprimir cualquiera.

Ejemplo

aporte

6
5
5 3 4 4 5
3
1 1 1
5
4 4 3 4 4
5
5 5 4 3 2
3
1 1 2
5
5 4 3 5 5

producción

3
-1
4
3
3
1

Nota
El primer caso de prueba del ejemplo se describe en la declaración del problema.

En el segundo caso de prueba del ejemplo, no hay pirañas dominantes en el acuario.

En el tercer caso de prueba del ejemplo, la cuarta piraña puede comerse primero a la piraña de la izquierda y el acuario se convierte en [4,4,5,4], luego puede comerse cualquier otra piraña del acuario.


Título:

Similar a un pez grande que se come a un pez pequeño, cada pez solo puede comerse al pez que está al lado y más pequeño que él . Cuando come pescado, su tamaño es +1 . Elija un pez para comerse todos los demás peces (la respuesta no es única, solo envíe uno)


Ideas:

Encuentre la ubicación del pez más grande (puede haber más de uno) , si hay uno más pequeño al lado (en este momento, después de que termine de comer , será el pez más grande ), entonces debe poder comer. todo el pescado


Código:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
int t,n,x;
int main()
{
    
    	   
	cin>>t;
	while(t--)
	{
    
    
		cin>>n;
		map<int,vector<int>> mp; //记录大小为某值的所有鱼的位置
		vector<int> v;
		int maxnum=-1; //记录最大的体积
		for(int i=0;i<n;i++)
		{
    
    
			cin>>x;
			mp[x].push_back(i);
			v.push_back(x);
			maxnum=max(maxnum,x);
		}
		
		int flag=0,ans=0;
			for(auto y:mp[maxnum]){
    
    
				if(y-1>=0 && v[y-1]<maxnum)  //左边有比他小
				{
    
    
					ans=y+1; //下标从0开始,所以要+1
					flag=1;
					break;
				}
				else if(y+1<n && v[y+1]<maxnum) //右边有比他大
				{
    
    
					ans=y+1; 
					flag=1;
					break;
				}
			}
			
		
		if(flag==0) cout<<-1<<endl; //找不到
		else cout<<ans<<endl;
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45260385/article/details/110824641
Recomendado
Clasificación