Codeforces Ronda 870 (Div. 2) (A--D)

A. No confíes en nadie

1. Problema

A. No confíes en nadie

2. Análisis

porque nn es muy pequeño, así que enumere directamente el número de mentirososkkk , y luego recorre la matriz para contar si el número de personas que hablan es igual akkk es lo mismo. Si son iguales, emite directamente, si no hay coincidencia, emite -1.

3. Código

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve()
{
    
    
	int n;
	cin >> n;
	vector<int>a(n);
	for(auto &x : a)
		cin >> x;
	bool flag = false;
	for(int i = 0; i < n; i ++)
	{
    
    
		int cnt = 0;
		for(int j = 0; j < n; j ++)
		{
    
    
			if(a[j] > i)
				cnt++;
		}
		if(cnt == i)
		{
    
    
			cout << cnt << endl;
			return;
		}
	}
	cout << -1 << endl;
}
int main()
{
    
    
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	solve();
}

B. Lunatic Never Content

1. Problema

B. Lunatic Never Content

2. Análisis

Suponga que los dos elementos uno frente al otro extremo con extremo son aaa ybbb
a mod x = b mod xa\ mod\ x = b\ mod\ xun mod x _ _  =segundo metro o re X  
una modificación x - segundo modificación x = 0 una\ mod\ xb\ mod\ x = 0un mod x _ _  b m o d x  =0
( un − segundo ) módulo x = 0 (ab)\ módulo\ x =0( unb ) m o d x  =0

nuestro xxSi x es cada grupode abs ( a − b ) abs(ab)abdominales ( un _b ) factor, también tenemos que asegurar el valor máximo. Es decir, encontrarel máximo común divisor.

3. Código

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e5 + 10;

void solve()
{
    
    
	int n;
	cin >> n;
	vector<int>a(n),b;

	for(int i = 0; i < n; i ++)
		cin >> a[i];

	for(int i = n - 1; i >= 0; i --)
		b.push_back(a[i]);

	if(a == b)
	{
    
    
		cout << 0 << endl;
		return;
	}
	
	int nums = -1;
	int l = 0, r = n - 1;
	while(l < r)
	{
    
    
		if(a[l] == a[r])
		{
    
    
			l ++ ,r --;
			continue;
		}
		if(nums == -1)
			nums = abs(a[l] - a[r]);
		else
			nums = __gcd(abs(a[l] - a[r]), nums);
		l ++ ,r --;
	}
	cout << nums << endl;
}

signed main()
{
    
    
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	solve();
}

C. Soñando con la libertad

1. Problema

C. Soñando con la libertad

2. Análisis

Considere primero el caso especial, si nnn ymmSi m es 1, entonces la votación debe completarse. Una es que solo hay un algoritmo y la otra es que solo hay una persona.

Luego discuta n ≠ 1 & & m ≠ 1 n\neq 1 \ \&\&\ m \neq 1norte=1 y m  =1 caso

si n ≤ mn \leq mnortemetro

Solo necesitamos votar por un algoritmo en el momento de la primera votación. En este momento, en todos los algoritmos, aparecerá nnn algoritmos tienen 1 voto,n − m nmnortem algoritmos tienen0 00 votos En este momento, losn − m nmnortem algoritmos, dejando solonnn algoritmos. A continuación, seguimos manteniendo esta estrategia, es decir, una persona vota por un algoritmo, lo que conducirá a estennEl número de votos para n algoritmos es siempre el mismo. Es decir, definitivamente no se terminará.

si n > m n > mnorte>metro

hotel _a esnnUn factor de n , mientras que 1 < a < m 1<a<m1<a<m , en este caso podemos dejar elnnn personas solo votan poraaun algoritmo, al mismo tiempo debido a la relación de divisibilidad, estennCada uno de los n algoritmos puede obtenerna \frac{n}{a}anboleto. Después de que termine la ronda, habrá este aaa , y luego solo necesitamos continuar repitiendo la estrategia anterior, manteniendo cada algoritmona \frac{n}{a}anEntradas, bucle sin fin.
En resumen, si nnFactores de n menor que mmm , entonces habrá un bucle infinito.

Si no se cumplen las tres condiciones anteriores, debe ser posible finalizar la votación dentro de un número limitado de veces.

3. Código

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;

void solve()
{
    
    
	int n, m;
	cin >> n >> m;

	if(m == 1 || n == 1)
	{
    
    
		cout << "YES" << endl;
		return;
	}
	if(n <= m)
	{
    
    
		cout << "NO" << endl;
		return;
	}
	for(int i = 2; i <= sqrt(n); i ++)
	{
    
    
		if(n % i == 0)
		{
    
    
			if(i <= m && i != 1)
			{
    
    
				cout << "NO" << endl;
				return;
			}
			if(n / i <= m && n / i != 1)
			{
    
    
				cout << "NO" << endl;
				return;
			}
		}
	}
	cout << "YES" << endl;

}

signed main()
{
    
    
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	solve();
}

D. Correr millas

1. Problema

D. Correr millas

2. Análisis

Primero deformamos la fórmula.
segundo 1 + segundo 2 + segundo 3 − ( r − l ) b1+b2+b3-(rl)segundo 1+segundo 2+segundo 3( rl )
segundo 1 + segundo 2 + segundo 3 - r + l b1+b2+b3-r +lsegundo 1+segundo 2+segundo 3r+l
( segundo 1 + l ) + segundo 2 + ( segundo 3 − r ) (b1+l)+b2+(b3-r)( segundo 1+yo )+segundo 2+( segundo 3r )

Ahora podemos construir tres matrices, una matriz es bi + i b_i+ibyo+i , una matriz esbi b_ibyo, una matriz es bi + i b_i+ibyo+i

Llamemos a estas tres matrices: A , B , CA,B,Cun ,B ,C. _

Solo necesitamos enumerar cada B i B_iByo, y luego encuentra la iiEl mayor A imax antes de i A_{imax}Asoy x, y en iiEl mayor C imax después de i C_{imax}Csoy x, puede obtener el B i B_i actualByo, La mejor decision. Siga la rutina anterior para atravesar cada B i B_iByo, encuentre la solución óptima y finalmente compare un valor máximo.

Del enfoque anterior, podemos ver que el último intervalo enumerado es dejar que los dos valores máximos se distribuyan en los extremos izquierdo y derecho del intervalo. ¿Por qué es correcto hacerlo?

Veamos primero el extremo izquierdo, si el elemento al que está nuestro extremo izquierdo no es el más valorado, significa que nuestro llTambién puedo moverme a la derecha, en este momentolll se hará más grande, y el resultado también se hará más grande, hasta que alcance la posición más valorada. rra la derechar de la misma manera.

Se puede ver a partir de esta prueba que nuestros extremos izquierdo y derecho deben estar lo más cerca posible del valor máximo.

A continuación, tenemos que probar una cosa más: por qué el método anterior puede garantizar que estos tres números sean los primeros tres números más grandes. Tomemos el extremo izquierdo como ejemplo. Si el extremo izquierdo no es el de mayor valor, significa que hay un kk en el lado derecho del extremo izquierdo.k es mayor que el extremo izquierdo ylk > l l_k>lyok>l , entoncesk + lk k+l_kk+yok> A l A_lAyo. Entonces nuestro A l A_lAyoNo es el valor máximo, pero de acuerdo con nuestra rutina ahora mismo, tomamos iiEl valor máximo delante de i . Los dos son contradictorios. Por lo tanto, el punto final debe ser el más valioso.

Luego, el proceso de encontrar el valor máximo puede usar la idea de suma de prefijos y suma de sufijos para preprocesar el valor máximo.

3. Código

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 1e5 + 10;
void solve()
{
    
    
	int n;
	cin >> n;
	vector<int>a(n), b(n), c(n), B(n), C(n);
	for(int i = 0; i < n; i ++)
		cin >> a[i];
	for(int i = 0; i < n; i ++)
	{
    
    
		b[i] = a[i] + i;		
		if(!i)
			B[i] = b[i];
		else
			B[i] = max(B[i -  1], b[i]);
	}
	for(int i = n - 1; i >= 0; i --)
	{
    
    
		c[i] = a[i] - i;
		if(i == n - 1)
			C[i] = c[i];
		else
			C[i] = max(C[i + 1], c[i]);
	}
	int ans = -INF;
	for(int i = 1; i < n - 1; i ++)
	{
    
    
		ans = max(a[i] + B[i - 1] + C[i + 1], ans);
	}
	cout << ans << endl;
}

signed main()
{
    
    
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	solve();
}

Supongo que te gusta

Origin blog.csdn.net/weixin_72060925/article/details/130522567
Recomendado
Clasificación